代码之家  ›  专栏  ›  技术社区  ›  Robin Clowers

Windows工作流类型加载异常

  •  0
  • Robin Clowers  · 技术社区  · 15 年前

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

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

    2 回复  |  直到 15 年前
        1
  •  1
  •   Robin Clowers    15 年前

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

        2
  •  0
  •   Will    15 年前

    我的猜测是,在WF尝试反序列化之前,没有加载其他程序集。您可以通过在应用程序开始执行之前(即在程序类的主方法中,对于WinForms应用程序)简单地新建一个此类的实例来测试这一点。

    如果是这样的话,你可以尝试一些东西。

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

    第二 , you can add logic to runtime type resolution. 这似乎是可能的,但我从来没有做过。

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

    我不知道你是如何序列化你的工作流程的,所以我不能确切地告诉你怎么做。我可以告诉您,工作流被序列化为XAML。XamlReader可以在反序列化时加载包含在Xaml中的类型的程序集。这是通过使用 special type of XML namespace .

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

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

    在程序集mycode.dll中定义了mytype:

    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,查找该程序集,将其加载到内存中,然后查找mycode namespace.mytype。

    然后问题变成了,“我如何让我的工作流序列化那个名称空间?”??”答案是“我不知道”。也许可以使用以下程序集属性:

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

    但我不确定工作流序列化程序是否会尊重这些。见鬼,我甚至不确定工作流序列化程序是否会首先尊重clr名称空间。你可以试一试,如果不试一试的话,可以根据这个问题再问一个问题。