为什么运行时不会自动解析我的程序集依赖项?

时间:2010-02-05 09:06:33

标签: c# .net com assembly-resolution mmc

我有一些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启动的?我是个笨蛋吗?

1 个答案:

答案 0 :(得分:2)

两者都是。您运行MMC的事实使.NET很难解析程序集,它不会在c:\ windows \ system32中找到任何内容。使用MMC的.config文件无法合理地解决这个问题,它将会破坏任何未来的插件。

COM也没有帮助,放置COM DLL的目录不会以任何方式影响探测路径。你已经找到了解决这个问题的方法,AssemblyResolve。或者您可以将所有内容都放在GAC中。

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