Windows工作流类型加载异常

时间:2009-02-20 18:26:52

标签: .net workflow-foundation

我正在使用Windows工作流构建状态机,我正在尝试在我的解决方案中从另一个程序集中新建一个对象。当我构建解决方案时,我从StateActivityValidator获取一个TypeLoadException(在成功构建之后运行它以查看所有必需的属性都已设置等)。

我尝试创建实例的类型非常简单,它有一个默认的公共构造函数,并且两个程序集都是签名的。任何想法可能是什么问题?

2 个答案:

答案 0 :(得分:1)

此问题是由GAC中这些程序集的版本不匹配引起的。

答案 1 :(得分:0)

我的猜测是在WF尝试反序列化之前没有加载其他程序集。您可以在应用程序开始执行之前简单地新建一个这种类型的实例来测试它(例如,在您的Program类的Main方法中,为winforms应用程序)。

如果是这种情况,您可以尝试一些事情。

首先,在反序列化之前强制加载内存中所需的所有程序集(如上面的测试)。这种方法,imho,很糟糕。

第二次you can add logic to runtime type resolution.似乎有可能,但我从未这样做过。

第三次,修改序列化工作流程,为其提供加载类型所需的信息。

我不确定您是如何序列化工作流程的,所以我无法确切地告诉您如何执行此操作。我可以告诉你,工作流被序列化为xaml。在反序列化时,XamlReader可以加载xaml中包含的类型的程序集。这是通过使用special type of XML namespace

完成的

假设这是您缺少的类型(在序列化的工作流程中):

<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-namespace。你可以尝试一下,如果不是基于此就在SO上提出另一个问题。