C#对本机互操作的限制

lys*_*cid 2 .net c# pinvoke interop native

我知道C#允许使用PInvoke与本机代码进行互操作(管理/非托管代码互操作性概述)

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

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

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

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

Mat*_*son 5

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

  • @ lysergic-acid您可以在托管C++类中包装较低级别的结构,并使用C#中的结构. (2认同)
  • @MatthewWatson它不称为托管C++.它的正式名称是C++/CLI. (2认同)