编辑:我忘了提到一件重要的事情——加载我的程序集的应用程序实际上不在同一个目录中(与其他dll不同)。在研究Fusion日志后,我注意到加载dll
的方式与我之前想象的不同。(是的,我应该先看文档,我很惭愧)
C:\Test\appLoadingStuff.exe
C:\Lib\Acme.Application.dll
C:\Lib\Acme.Data.dll
- ...
.NET会探测应用程序基础目录(除了GAC和其他东西之外;即加载应用程序的目录- C:\Test\
),并且不关心已加载的dll
存储在哪个位置(其他目录)。
在使用.NET框架时,我发现自己遇到了ReflectionTypeLoadException
异常:
System.TypeLoadException
无法加载所请求的一个或多个类型。检索LoaderExceptions属性以获取更多信息。
无法从程序集'Acme.Data.Dao,Version=1.1.0.4,Culture=neutral,PublicKeyToken=null'中加载类型“Acme.Data.Foo”。:“Acme.Data.Foo”
为简单起见,我有3个程序集:
Acme.Application
我的主程序集Acme.Data
我的数据对象(由第一个引用)Acme.Data.Dao
我的数据访问对象(由第一个引用)
还有另一个应用程序,实际上是加载我的主程序集的。所有.dll
文件都在同一个目录中。
正如您所期望的那样,类型Acme.Data.Foo
存在于程序集Acme.Data
中。尽管如此,.NET试图在另一个程序集Acme.Data.Dao
中查找它-这会失败,因为该类型不存在其中。
我无法弄清楚是什么让.NET在错误的程序集中查找特定类型。当访问程序集上的类型时,立即抛出异常:
System.Reflection.RuntimeAssembly assembly = Assembly.LoadFile("C:\Lib\Acme.Application.dll")
var types = assembly.GetTypes(); // -> explodes
当我尝试使用以下方法检查引用的程序集时:
assembly.GetReferencedAssemblies()
我可以清楚地在列表中看到我需要的程序集。
没有程序集重定向(据我所知,这只会影响版本)。程序集的版本是正确的。
还有什么其他需要注意的吗?
AppDomain.CurrentDomain.AssemblyResolve
事件处理程序,以正确加载整个依赖项树。 - Zdeněk