6

AppDomain.CreateInstanceFromAndUnwrap()用来在不同的AppDomain. 我无法让它工作,因为它不断向我抛出以下错误:

无法加载文件或程序集“COMon,Version=2.0.4960.27874,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该模块应包含程序集清单。

但是,我发现这是因为它试图加载我的 DLL(与我的 .NET 程序集同名)。

这就是我调用该方法的方式:

_script = (Script)_appDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().Location, "COMon.Scripting.Script");

只要没有与我的 .NET 程序集同名的本机 DLL 文件,它就可以正常工作。当我将 .NET 程序集的完整路径和文件名传递给它时,为什么会发生这种情况?

4

1 回答 1

3

当我将.NET 程序集的完整路径和文件名传递给它时?

这不是方法的工作原理。第一个参数是程序集的显示名称。它不是文件名。MSDN 文章建议您查看 Assembly.FullName 以了解有关显示名称的更多信息。

因此,正常的 CLR 搜索规则将对查找程序集有效。它将首先在 GAC 中查找,然后在 AppDomain 的探测路径中查找。有一个你没想到的怪癖,CLR不注意文件的文件扩展名。程序集的显示名称未指定它。所以它认为一个 EXE 和一个 DLL 等效。您可以在 Fuslogvw.exe 的跟踪中看到一些东西,当您遇到此类问题时,您总是想使用该实用程序。在其他地方,例如,添加对 EXE 的引用可以正常工作。

所以它找到了 COMon.exe,这是一个 kaboom,它不是一个托管程序集。

除了简单地重命名程序集之外,您的情况可能是什么正确的解决方法尚不清楚。当您修改 AppDomains 时,您通常还希望使用 AppDomainSetup 并设置 ApplicationBase 或 PrivateBinPath 属性。

于 2013-07-31T16:50:36.980 回答