0

我有一些 c++ 代码是基于 MMC 的应用程序的管理单元。此管理单元通过 COM 包装器 (AssemblyA) 使用 .net 2.0 dll。AssemblyA 与启动 MMC 会话的应用程序位于同一目录中。AssemblyA 使用其他一些 .net dll (OtherAssemblies),由于我无法控制的原因,它们不能与 AssemblyA 位于同一目录中。它还允许动态加载某些组件(从 AssemblyB),并在第三个目录中搜索这些组件。来自 AssemblyB 的动态组件引用了 AssemblyA,因为它们在其中扩展了一个基类。

我的问题是,当我尝试加载动态组件时,它无法解析对 AssemblyA 的依赖,并且我的AssemblyResolve处理程序被触发(我使用它来解决OtherAssemblies)。当我Assembly.GetExecutingAssembly ()AssemblyResolve处理程序中查询时,程序集就是我要解析的程序集。

这种行为对我来说似乎有点奇怪,因为我希望 .NET 运行时首先在加载的程序集中查找依赖项,然后在我正在加载的程序集中查找依赖项,然后在 app 目录中查找。其中的第一个和第三个应该包含我要加载的程序集。

我已经修改了我的 AssemblyResolve 方法,以便它在其他位置搜索依赖项,因此它可以工作,例如当前的应用程序目录,但如果我能提供帮助,我真的不想这样做。

这种行为是预期的吗?是因为它是一个 MMC 应用程序,还是因为它是从 C++ 调用的 COM 启动的?我是个笨蛋吗?

4

1 回答 1

2

两者兼而有之。您正在运行 MMC 的事实使 .NET 难以解析程序集,它不会在 c:\windows\system32 中找到任何程序集。您无法使用 MMC 的 .config 文件合理地解决此问题,它将与任何未来的插件一起使用。

COM 也无济于事,您放置 COM DLL 的目录不会以任何方式影响探测路径。您已经找到了解决此问题的一种方法,即 AssemblyResolve。或者,您可以将所有内容都放在 GAC 中。

或者您可以避免使用 COM 并直接使用Microsoft.ManagementConsole 命名空间编写 MMC 插件。

于 2010-02-05T13:30:50.413 回答