1

一般:我有一个符合标准的 C++ API,它使用 Boost 库,我想支持它作为 Windows、OS X 和 Linux 上的本机、静态可链接库,并且我想在 Windows 和 Mono 上为 .NET 包装在 OS X 和 Linux 上。

细节:目前我已经为所有平台本地编译 - 这是使用标准 C++ 和 Boost 之后的。我还让它在 Windows 上为 C++/CLI 编译和运行,但我被迫使用 Boost .DLL。下一步我不确定从哪里开始,因为我从未尝试在 *nix 系统上使用共享库。我知道 Boost 在 Linux 上提供了共享库(我假设在 OS X 上也是如此),但是这些会自动与我的 Visual Studios 编译的 C++/CLI 可执行文件一起工作,还是我需要做一些工作?MonoDevelop 没有 C++/CLI 编译器,但据说 Visual Studios 编译的 CLI 可以正常工作……让我感到困惑的是动态链接库。

4

4 回答 4

7

C++/CLI 程序集只有在使用/clr:pure. 混合模式 C++/CLI 程序集(即使用本机代码的任何程序集,即:boost)将不会在非 Windows 平台上运行。

您最好的选择是提供 C API,并使用 P/Invoke 调用本机代码。这可以跨平台移植,前提是您在两个平台上都包含相同的 C API。

于 2010-11-02T18:37:09.283 回答
2

我确信您现在已经找到了另一种解决方案,但我确信这个问题仍然出现在搜索中。

Mono 最近在CXXI中的 C++ 互操作性方面取得了相当大的进步。

从这篇文章中可以看出,新的 CXXI 技术允许 C#/.NET 开发人员:

  • 从 C# 或任何其他 .NET 语言轻松使用现有的 C++ 类
  • 从 C# 实例化 C++ 对象
  • 从 C# 代码调用 C++ 类中的 C++ 方法
  • 从 C# 代码调用 C++ 内联方法(前提是您的库是使用 -fkeep-inline-functions 编译的或者您提供了代理库)
  • 从 C# 继承 C++ 类
  • 用 C# 方法覆盖 C++ 方法
  • 向 C# 代码和 C++ 公开 C++ 类或混合 C++/C# 类的实例,就好像它们是本机代码一样。

CXXI 是 Google Summer of Code 两个暑期工作的成果,旨在提高 Mono 与 C++ 语言的互操作性。

于 2012-02-17T07:18:32.700 回答
1

你不能在 C++/CLI 中真正做到这一点,因为 C++/CLI 不是 C++。正如 Reed 所说,您需要使用 编译/clr:pure,这将迫使您删除用 CLR 类替换每个类,这基本上会破坏首先尝试在那里编译的点。

你为什么要这样做?

于 2010-11-02T18:58:54.407 回答
0

请记住,.net 遵循“ Fusion ”作为定位库的模型(在 .net 中,这些库基本上都是动态链接的)。在 Windows 平台上,本机代码不遵循融合加载模型。检查LoadLibraryEx 文档,从它说的地方阅读:

如果指定的文件名没有路径并且基本文件名与加载模块的基本文件名不匹配,或者指定了路径但未使用 LOAD_WITH_ALTERED_SEARCH_PATH,则 LoadLibraryEx 函数对模块执行标准搜索。

...以及以下段落。我将 C# 构建到 C++/CLI 的方式是让我的 C# 加载器检查它当前是被 JITted 为 x86 还是 x64,然后我显式加载与该架构匹配的 C++/CLI 程序集。如果你不这样做,那么你就不能在 C# 端编译为“AnyCPU”。

我不知道这如何在 Windows 之外发挥作用......

于 2010-11-02T18:45:14.047 回答