在 C++ 应用程序的另一个目录中使用 C# 库
Posted
技术标签:
【中文标题】在 C++ 应用程序的另一个目录中使用 C# 库【英文标题】:Using C# library in another directory from C++ application 【发布时间】:2014-12-30 17:50:02 【问题描述】:我有一个用 C# 编写的类,在 C# 和 C++ 应用程序之间共享。
为了在 C++ 应用程序中使用它,我编写了一个 CLI 包装类。
简单图:
C++ 应用程序---访问---> CLI 库---访问---> C# 库
不幸的是,由于某些我无法控制的名称冲突,C# 和 C+ 应用程序需要位于不同的目录中。
有哪些选项可以让我的 C++ 应用程序访问另一个目录中的这些库?
我可以在我的 C++ 应用程序中使用 AfxLoadLibrary 来加载 CLI 库吗?在这种情况下, CLI dll 和 C# dll 是否必须在同一目录中?
我可以让托管 CLI 库动态加载 C# 库吗?
我还缺少其他选项吗?
【问题讨论】:
有几种方法可以做到这一点。最快的可能是使用AppDomain.AssemblyResolve
将失败的加载重定向到另一个文件夹。最干净的可能是一种知道接口的代理库,然后您可以从那里动态加载程序集。
非常不清楚在这种情况下 CLR 是如何加载的,它不是自动的。这可能是首先缺少的。使用自定义 CLR 托管或 COM。
目前(它正在与同一目录中的所有内容一起工作),C++ 应用程序链接到托管 CLI dll,后者链接到 C# 程序集。
@Hans 它是自动的。混合模式程序集在其本机导入表中列出了 mscoree.dll,导致即使在旧 Windows 版本上也可以由操作系统加载程序加载。自 XP 以来,OS 加载程序从其 PE 标头识别 dotnet 程序集。
【参考方案1】:
另一种选择:
将 yourapp.exe.config 文件添加到您的 exe 文件夹,将一个或多个子文件夹列为 probing paths。将每个库程序集的文件放入其中一个子文件夹中。您可以根据需要将所有程序集(应用程序程序集除外)放在一个文件夹中。
【讨论】:
您是否建议我为 C++ 或 C# 应用程序这样做? @PortMan 它必须在 exe 文件之后和旁边命名。它是什么类型的exe并不重要。我什至使用过 javaw.exe.config。以上是关于在 C++ 应用程序的另一个目录中使用 C# 库的主要内容,如果未能解决你的问题,请参考以下文章