0

有谁知道从 C# 调用 MIT 的 Meep 模拟包的方法(可能是 Mono,上帝帮助我)。

我们被 #$@%#$^ CTL 前端卡住了,这是一个生产力杀手。我们正在集成到我们的 sim 管道中的其他一些应用程序使用 C# (.NET)。我已经看到了 Meep 的 Python 接口(比 CTL 早了好几年),但我希望让我们正在开发的代码尽可能同质化。

而且,不,用 Python 编写其余工具不是一种选择。为什么?因为我们讨厌它。愚蠢的巴金斯。我们永远讨厌它!

(实际上,各种应用程序目标并不适合 Python 实现,而我所拥有的人才库使用 C# 更有效率。)

或者,以更友好的问题形式:

是否有一种方便/可能的方式将 GNU C++ 库链接到 Windows 上的 C# 或 Linux 上的 Mono?

4

1 回答 1

0

直接且可移植的解决方案是为 libmeep 编写一个 C++ 包装器,它公开一个 C ABI(通过extern "C" { ... }),然后使用 P/Invoke 围绕该 API 编写一个 C# 包装器。这大致相当于 Python Meep 包装器 AFAICT。

当然,通过平面 C API 将 C++ 类映射到 C# 类并非易事——您必须在 C# 类中保留 C++ 类的 IntPtr 句柄,使用 GCHandles 或 IntPtrs 字典正确实现 Dispose 模式在重新显示 C++ 对象(如果需要)等时允许引用完整性。在 C# 中子类化 C++ 对象并能够覆盖虚拟方法变得非常复杂。

有一个名为 SWIG 的工具可以自动执行此操作,但结果不会像手写包装器那样好。

如果您限制自己使用 Windows/.NET,Microsoft 有一个称为 C++/CLI 的 C++ 超集,它使您能够用 C++ 编写一个直接导出 .NET API 的包装器。

于 2010-10-21T05:38:15.037 回答