Put*_*ato 16 .net exception-handling assembly-resolution assemblyresolve
迁移到.net 4后,我们开始面对库的问题.假设我们有我们的库MyLib.dll,它引用了Interop程序集Interop.dll.Interop.dll引用了MissingInterop.dll.
所以引用可以显示为: MyLib.dll -> Interop.dll -> MissingInterop.dll
在MyLib.dll中,我们只使用Interop.dll中的部分类,因此我们永远不会调用任何需要MissingInterop.dll的内容,并且在.net 3.5中它运行正常这就是为什么我们不使用MyLib.dll发送MissingInterop.dll.
当我们在.net 4下运行的进程使用MyLib.dll时,应用程序失败,并出现以下异常:
FileNotFoundException:"无法加载文件或程序集'MissingInterop.dll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.系统找不到指定的文件."
另外我注意到Interop.dll引用了其他缺少的dll但是.net不会尝试加载它们.我发现了差异.MissingInterop.dll中的某些类型用于Interop.dll中的方法参数,而来自其他缺失库的类型仅用作方法返回类型,即在Interop.dll中我可以看到:
Class C1
MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&)
Class C2
get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB()
Run Code Online (Sandbox Code Playgroud)
和.NET 4尝试加载MissingInterop.dll但不尝试加载AnotherMissingInterop.dll.
.NET 3.5没有尝试加载MissingInterop.dll和AnotherMissingInterop,因为它们没有在执行路径中使用.
我知道.NET 4有新的Fusion,但我没有在任何地方找到这样的突破性变化.有谁知道为什么.NET 4会尝试加载不需要的东西?有没有办法解决这个问题,而无需重新编译代码或添加丢失的文件?
小智 0
当您将应用程序从 .NET 3.0、3.5 迁移到 4.0 时,您需要将此 mylib.dll 外部包含到您的项目中并编译它们,或者如果可能的话,您有程序集的源代码,然后将其更改为 .net 4.0