我有一个程序集A
,此程序集动态加载程序集B
,C
和E
。并且它将来会加载更多。
问题一:
B
引用F
和G
,当我尝试在B
A
中声明的类型实例中执行方法时,我得到一个异常告诉我当然没有发现F
问题:
F
和G
B
,假设F
和G
与B
位于同一文件夹中?F
和G
B
,假设F
和G
位于不同的文件夹中? 问题二:
这几乎是因为,在尝试快速测试某些功能时,我将引用的程序集从B
的二进制文件夹复制到A
,这导致以下例外:
无法加载文件或程序集' log4net,版本= 1.2.10.0, Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其中一个 依赖。定位程序集的清单定义没有 匹配程序集引用。 (HRESULT异常:0x80131040)
我认为这是因为我使用log4net
的不同版本而不是B
的某个依赖关系。
的 问题:
我可以采取什么措施来避免这种版本问题?
修复问题会解决这个问题吗?如果没有,为什么?
我应该使用Autofac吗? 它会帮助我吗?怎么样?
请记住,汇编A
的想法是采用"插件",并按顺序,声明性地指向汇编或其依赖关系不是一个选项
答案 0 :(得分:3)
只要程序集在版本中兼容,就可以指示CLR加载特定版本,而不管编译所依赖的程序集是什么版本。
例如,将此代码段添加到配置文件中会将System.Web.Mvc程序集的1.0.0.0-2.0.0.0重定向到3.0.0.0。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
您可以对任何装配使用相同的原理,例如log4net的。
尽管如此,您首选的解决方案应该是获取针对正确的程序集版本编译的版本。例如,log4net在源代码中可用,因此易于下载并使用更新的依赖项重新编译。
如果您不确定哪个程序集导致问题,那么有一个名为Fusion Log Viewer(fuslogvw.exe)的工具,它与.NET框架一起安装。使用它有点古怪,但会向您展示.NET搜索程序集的确切位置以及在程序集解析期间发生的任何错误。