C# 对本机互操作的限制

Posted

技术标签:

【中文标题】C# 对本机互操作的限制【英文标题】:Limitations of C# to native interop 【发布时间】:2014-01-27 13:15:09 【问题描述】:

我知道 C# 允许使用 PInvoke (An Overview of Managed/Unmanaged Code Interoperability) 与本机代码进行互操作

我们正计划开发新代码,并正在考虑 2 个选项:

    本机解决方案 + 托管 (C#) 包装器围绕调用本机代码的互操作代码。 完全托管的解决方案

我想知道这个互操作是否有任何记录在案的限制? (例如 - 某些类型不能在托管/本机之间来回编组等)

这些限制可能会影响我们决定使用(或不使用)选项 #1。

【问题讨论】:

在您的上下文中什么是原生解决方案?如果您可以使用托管代码来做到这一点,您为什么要考虑替代方案? 我可能会采用原生的低层,并在其他一些仅原生的平台上使用它。 假设您可以部署这样的解决方案,则选项 1 没有限制。 【参考方案1】:

P.O.D. (plain-old-data) 结构通常很容易编组。

但是如果你想编组包含向量之类的复杂 C++ 类,那么你会遇到麻烦。

如果您可以编写 C/C++ 代码将复杂的类转换为更简单的类型以便通过 p/invoke 调用,那没关系 - 但否则,请远离复杂的 C++ 类。

但是,还有另一种可能。

您可以使用所谓的“它只是工作”技术使用 CLI C++ 类来包装 C++ 代码。您可以在 C++ 中混合使用非托管代码和 CLI 代码——甚至在同一个文件中——这真的很有帮助。

更多详情请看这里:

http://msdn.microsoft.com/en-us/library/ms173185.aspx

http://www.windowsdevcenter.com/pub/a/dotnet/2003/03/03/mcppp2.html(这个比较老了)

http://www.codeproject.com/Articles/651516/Exposing-native-to-managed-Cplusplus-CLI-vs-P-Invo

【讨论】:

低级 C++ 代码也可能不在我手中(例如:使用现有库)。这会使强制这些原生结构变得“元帅友好”变得更加困难 @lysergic-acid 您可以将较低级别的结构包装在托管 C++ 类中,并使用 C# 中的那些。 @lysergic-acid 您可以随时包装任何库并从 p/invoke 或混合模式 C++/CLI 调用它 @MatthewWatson 它不称为托管 C++。它的正式名称是 C++/CLI。 @DavidHeffernan True - 托管 C++ 很久以前就被弃用了。

以上是关于C# 对本机互操作的限制的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中本机互操作性的代码组织

本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃

使用 CSC 编译 C# 代码 - excel 互操作

COM 互操作性需要强命名程序集?

在本机互操作中控制 WPF

将 C# 与 C 函数互操作的性能损失 [关闭]