在 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# 库的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ dll 编组导出的字符串向量

在非托管 C++ 程序中实现 C# DLL COM 文件

如何在 C# 中编写我自己的包装器?

将数据行从 C# 中的另一个 sql 表插入到 sql 表中

在 C# 中的另一个对象内实例化用户定义的对象

如何将 .exe 从 C++ 项目复制到 C# 项目的输出目录?