c# - C# 对 native 互操作的限制

标签 c# .net interop pinvoke native

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

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

  1. native 解决方案 + 调用 native 代码的互操作代码的托管 (C#) 包装器。
  2. 完全托管的解决方案

我想知道此互操作是否有任何记录在案的限制? (例如,某些类型无法在托管/ native 之间来回编码等)

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

最佳答案

POD。 (普通旧数据)结构通常相当容易编码。

但是,如果您想要编码包含向量等内容的复杂 C++ 类,那么您就会遇到麻烦。

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

但是,还有另一种可能性。

您可以使用所谓的“It just Works”技术通过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# - C# 对 native 互操作的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21381907/

相关文章:

c# - 如何从 C++ DLL 动态加载 C# dll

c# - LAB 到 RGB 使用 Lcms2 给出奇怪的结果

java - 是否有与 C# linq let 等效的 java lambda 表达式?

c# - 将 DataTemplate 中的按钮绑定(bind)到表单的 ViewModel 中的命令

c# - 进度栏帮助

c# - "Win32Exception: The operation completed successfully"在 32 位 Windows 上的 WTSQueryUserToken 之后(64 位有效)

c# - 如何在托管 (C#) 和非托管 (C++) 代码之间来回传递数组内容

c# - 如何比较两个装箱变量的值?

c# - 如何以编程方式在 C# 中创建 MS Access 表?

c# - 正则表达式匹配未完成