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# 对本机互操作的限制的主要内容,如果未能解决你的问题,请参考以下文章