Исключение загрузки типа рабочего процесса Windows - PullRequest
0 голосов
/ 20 февраля 2009

Я создаю конечный автомат с рабочим процессом Windows и пытаюсь создать объект из другой сборки в своем решении. Когда я создаю решение, я получаю исключение TypeLoadException от StateActivityValidator (который запускается после успешной сборки, чтобы увидеть, что все необходимые свойства установлены и тому подобное).

Тип, который я пытаюсь создать, очень прост, у него есть открытый конструктор по умолчанию, и обе сборки подписаны. Есть идеи, в чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 20 февраля 2009

Эта проблема была вызвана несовпадением версий этих сборок в GAC.

0 голосов
/ 20 февраля 2009

Я предполагаю, что эта другая сборка не загружается до того, как WF пытается десериализоваться. Вы можете проверить это, просто обновив экземпляр этого типа до того, как ваше приложение начнет выполняться (т.е. в методе Main вашего класса Program для приложения winforms).

Если это так, вы можете попробовать несколько вещей.

Сначала , принудительная загрузка всех необходимых вам сборок в память перед десериализацией (как в тесте выше). Этот метод, имхо, отстой.

Секунду , вы можете добавить логику к разрешению типов во время выполнения. Это представляется возможным, но я никогда не делал этого.

Третий , измените ваш сериализованный рабочий процесс, чтобы предоставить ему информацию, необходимую для загрузки типа.

Я не уверен, как вы сериализуете свой рабочий процесс, поэтому я не могу точно сказать вам, как это сделать. Я могу сказать вам, что рабочие процессы сериализуются в xaml. При десериализации XamlReader может загружать сборки типов, включенных в xaml. Это делается с использованием специального типа пространства имен XML .

Допустим, это ваш отсутствующий тип (в сериализованном рабочем процессе):

<MyType><!--blahblah--></MyType>

и MyType определен в сборке MyCode.DLL:

namespace MyCodeNamespace
{
  public class MyType { /*yadda*/ }
}

тогда пространство имен для этого типа будет: clr-namespace:MyCodeNamespace;assembly=MyCode и он появится в вашем сериализованном рабочем процессе как:

<MyType namespace="clr-namespace:MyCodeNamespace;assembly=MyCode"><!--blahblah--></MyType>

XamlReader распознает это пространство имен, определяет, что сборка называется MyCode.DLL или MyCode.EXE, ищет ее, загружает в память и ищет MyCodeNamespace.MyType.

Тогда возникает вопрос: «Как заставить мой рабочий процесс сериализовать это пространство имен ???» Ответ: «Я не знаю». Возможно, вы можете использовать следующие атрибуты сборки:

[assembly: XmlnsPrefix("clr-namespace:MyCodeNamespace;assembly=MyCode", "MyCode")]
[assembly: XmlnsDefinition("clr-namespace:MyCodeNamespace;assembly=MyCode", "MyCodeNamespace")]

но я не уверен, что сериализатор Workflow будет их учитывать. Черт, я даже не уверен, будет ли сериализатор Workflow в первую очередь учитывать пространство имен clr. Вы можете попробовать это, и если не задать другой вопрос о SO на основе этого.

...