【问题标题】:MFC managed code referencesMFC 托管代码参考
【发布时间】:2016-08-20 15:58:41
【问题描述】:

我正在尝试将 .Net DLL(称为 B.dll)引用到 C++ MFC 项目中,它基本上是 .Net 第三方的包装器(称为 C.dll)。我确实为 B.dll 创建了 tlb 文件,并且能够在 MFC 应用程序中实例化和调用它。

目前所有依赖项,B.tlb、B.dll 和 C.dll,都需要在 bin 中 MFC 应用程序的文件夹。我想要并且正在努力做的是将这三个文件放在 MFC 执行文件夹的子文件夹中。

我尝试将 B.dll 配置文件的“privatePath”设置为子文件夹,但据我了解,需要设置的不是 B.dll“privatepath”,而是 MFC 应用程序(显然没有据我所知,没有,因为它不是 .Net 应用程序)

感谢任何帮助。

【问题讨论】:

  • 在这种情况下,您肯定是在最大化 DLL Hell,这没有什么意义。 CLR 在与 somename.exe 相同的目录中查找 somename.exe.config 文件。所以你可以添加一个<probing> 元素来帮助它找到C.dll 文件。 B.dll 只能通过使用注册程序集所需的 Regasm.exe 命令中的 /codebase 选项或通过为 mfc 应用程序提供带有 <clrclass> 元素的清单来找到。在用户机器上使用 GAC 来实现 COM 依赖绝不是一个坏主意。
  • 为什么这个场景被认为是DLL地狱?你能解释一下吗?因为我无法在不制作 .Net dll 包装器并将其注册为 COM 组件的情况下这样做。

标签: c# .net mfc dllimport tlb


【解决方案1】:

你不需要使用 COM(如果你需要它,我的答案是过时的)。

您可以编写自己的 C++/CLI 包装 DLL,该 DLL 仅导出了一个本地接口。比调用这个原生包装器,这个包装器再次直接加载你的 .Net 组件并执行其中的代码。

在这个包装 DLL 中,您可以添加一个 ResolveEventHandler 来实现您自己的搜索(可能在子目录中)。将此添加到您的 CurrentDomain->AssemblyResolve

通过这个技巧,您可以绕过所有这些 COM 内容,并且您可以完全控制是否应该搜索无法加载的程序集。

我有来自here的解决方案

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 2014-12-27
    • 2010-12-03
    • 2013-08-24
    • 2013-10-28
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多