我想用标准的,独立于平台的C ++编写一个算法库。
然后我可以使用相同的C ++代码并为.NET编译它,以便C#应用程序可以使用该库吗? 如果没有,实现这种互操作的最简单方法是什么?
答案 0 :(得分:5)
您不能直接在C#和标准C ++之间进行接口。但是,您可以在C ++ / CLI包装器中使用C ++库,这使得.NET托管代码(以及C#)中的功能可用。
只需将包装器编写为C ++ / CLI库,公开.NET API并包含标准C ++库中的代码(但遗憾的是,据我所知,这不能静态链接。)
答案 1 :(得分:4)
您可以通过三种方式公开您的库,以便从托管代码轻松调用:
public ref class
的C ++ / CLI包装器 - C#代码将调用此类的方法,该方法将调用库的本机方法第三个,COM,我仅包括完整性。这不是我的第一选择。或者我的第三个。如果COM组件存在则是一回事,为此只写它是另一回事。
在前两个之间,问题是还有谁可以使用这个库。如果C#代码是唯一使用它的人,那就做你喜欢的。但是,例如,您可能有15或20个本机方法设置各种属性,然后是执行实际工作的go
或execute
方法。因为托管本机互操作有成本,我会告诉你编写一个带有20个参数的C ++ / CLI函数,调用各种本机函数,然后调用go
或execute
。这为您提供了一个更简洁的界面而不是聊天,并降低了互操作成本。
答案 2 :(得分:-1)
您可以使用pinvoke从任何.NET语言调用本机C / C ++库。这是MSDN的快速教程。您还可以使用COM Interop在C ++中创建可直接引用的COM dll。除非你需要COM的优点,否则pinvoke是一个更容易的路径。
当然,正如Konrad所说,你使用托管C ++解决方案包装C ++ dll。
例如,请查看http://www.pinvoke.net/以获取有关如何从C#调用win32 api的示例。
从上面的MSDN链接(根据以下评论修改):
using System;
using System.Runtime.InteropServices;
class PlatformInvokeTest
{
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int puts(
[MarshalAs(UnmanagedType.LPStr)]
string m);
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern int _flushall();
public static void Main()
{
puts("Hello World!");
_flushall();
}
}