无法从程序集“Not.Containing.Type.A”中加载类型“A”。

6

编辑:我忘了提到一件重要的事情——加载我的程序集的应用程序实际上不在同一个目录中(与其他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()

我可以清楚地在列表中看到我需要的程序集。
没有程序集重定向(据我所知,这只会影响版本)。程序集的版本是正确的。
还有什么其他需要注意的吗?

@MartinCostello 是的,基本上就是第二条信息 - 这很有道理,只有一半(类型确实不存在,但引用类型的程序集在那里,所以它在那里寻找)。 - Zdeněk
有人能把“Assembly”标签移除吗?我不小心在编辑投票上浪费了我的机会。 - David Hoelzer
不,我的意思是加载程序集的代码,而不是类型。另外,你那里有命名冲突吗?例如一个叫做Data的类型? - ManoDestra
1
@ManoDestra:尝试编写一个简单的控制台应用程序,逐个加载程序集,看起来我在那里遇到了更多问题,需要进行调查 - 但我猜测我的错误是因为依赖的程序集失败了... 哎 - Zdeněk
@ManoDestra:我忘了提到一个重要的事情,即加载我的dll的应用程序位于不同的目录中 - 这就是为什么它不能正常工作的原因。现在,我正在努力编写 AppDomain.CurrentDomain.AssemblyResolve 事件处理程序,以正确加载整个依赖项树。 - Zdeněk
显示剩余6条评论
1个回答

1

正如我在修改后的问题中所述,我错过了提及我尝试做的非常重要的属性。我的程序集是由另一个应用程序加载的该应用程序不在与已加载程序集相同的路径上

.NET正在探测运行应用程序的目录,而不是已加载的dll所在的目录。如果需要处理这种情况,则需要实现事件处理程序AppDomain.AssemblyResolve来处理已加载的dll的依赖项。

更多阅读:

感谢所有参与此问题的人,并对我没有分享这个至关重要的细节表示歉意(说实话,我没想到这个小细节很重要-现在我知道了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接