0

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

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

4

2 回答 2

1

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

于 2009-02-20T19:48:35.753 回答
0

我的猜测是在 WF 试图反序列化之前没有加载这个其他程序集。您可以通过在应用程序开始执行之前简单地新建一个这种类型的实例来测试这一点(即,在您的 Program 类的 Main 方法中,对于 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")]

但我不确定工作流序列化程序是否会尊重这些。见鬼,我什至不确定工作流序列化程序是否会首先尊重 clr-命名空间。您可以尝试一下,如果没有基于此就 SO 提出另一个问题。

于 2009-02-20T18:58:43.907 回答