在我们的项目中,我们使用WF来运行工作流程。 .net版本3.5。托管在IIS应用程序池中。显然,我们遇到了一些版本问题:
我们使用程序集的第1版启动工作流程。在我们到达持久性点之后,我们升级到版本2,我们需要能够让旧实例继续使用旧版本的程序集运行。
主工作流引用了几个程序集。我们使用程序集绑定,因为我们无法将程序集安装到GAC中。但是,我们遇到了一个非常奇怪的问题:
使用我们在web.config中的配置,我们设置
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Post.Appl.Corp.Sdds.Core" culture="neutral" publicKeyToken="58aaab7e0ddb1742" />
<codeBase version="1.2.11.0" href="v11\Post.Appl.Corp.Sdds.Core.dll"/>
<codeBase version="1.2.12.0" href="v12\Post.Appl.Corp.Sdds.Core.dll"/>
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Post.Appl.Corp.Sdds.Workflows" culture="neutral" publicKeyToken="58aaab7e0ddb1742" />
<codeBase version="1.2.11.0" href="v11\Post.Appl.Corp.Sdds.Workflows.dll"/>
<codeBase version="1.2.12.0" href="v12\Post.Appl.Corp.Sdds.Workflows.dll"/>
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Post.Appl.Corp.Sdds.Data" culture="neutral" publicKeyToken="58aaab7e0ddb1742" />
<codeBase version="1.2.11.0" href="v11\Post.Appl.Corp.Sdds.Data.dll"/>
<codeBase version="1.2.12.0" href="v12\Post.Appl.Corp.Sdds.Data.dll"/>
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Post.Appl.Corp.Sdds.Contracts" culture="neutral" publicKeyToken="58aaab7e0ddb1742" />
<codeBase version="1.2.11.0" href="v11\Post.Appl.Corp.Sdds.Contracts.dll"/>
<codeBase version="1.2.12.0" href="v12\Post.Appl.Corp.Sdds.Contracts.dll"/>
</dependentAssembly>
</assemblyBinding>
显然,工作流运行时正确地注意到它需要程序集(如果我们没有进行此配置,它会立即告诉我们,它找不到合适的版本)。
但是,一旦实例被反序列化,它就会抛出一个异常,说它无法将“System.Runtime.Serialization.TypeLoadExceptionHolder”转换为我们工作流中序列化属性的类型。
奇怪的是,GAC中完全相同的文件(甚至没有重新编译,未移动,未重命名)。你知道我们可能做错了什么吗?