2010-02-05 77 views
0

我有一些C++代码是一个管理单元的MMC基础的应用。此管理单元通过COM包装器(AssemblyA)使用.net 2.0 dll。 AssemblyA与启动MMC会话的应用程序位于相同的目录中。 AssemblyA使用一些其他的.NET的DLL(OtherAssemblies)的,我无法控制的原因不能住在同一目录AssemblyA。它还允许动态加载一些组件(来自AssemblyB),并在第三个目录中搜索这些组件。 AssemblyB中的动态组件引用AssemblyA,因为它们在那里扩展基类。为什么运行时不能自动解析我的程序集依赖项?

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

这种行为似乎有点怪我,因为我本来期望的.NET运行时查找在加载的程序集的依赖关系,然后再局部大会我加载,然后在app目录。其中的第一个和第三个应包含我试图加载的程序集。

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

这种行为是正常吗?是由于它是一个MMC应用程序还是由于它是从C++调用的COM启动的?我是笨蛋吗?

回答

2

它既是。你运行MMC的事实使得.NET很难解析程序集,它不会在c:\ windows \ system32中找到任何东西。你无法用MMC的.config文件合理解决这个问题,它将会使用任何未来的插件。

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

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

+0

virtual deja vous:http://stackoverflow.com/questions/2188024/c-calling-managed-com-object-cant-find-dependent-assemblies/2188116#2188116 – Ruddy 2010-02-05 13:34:30

+0

谢谢。我的扩展是一个现有插件的管理单元。不知道我是否可以重写它来使用托管命名空间的现有C++插件,特别是它已经工作。 GAC并不是一个真正的选择,所以它看起来像我现有的解决方案,但它感觉是错误的路要走。 – 2010-02-05 13:52:56

相关问题