将标准C ++嵌入到.NET应用程序中

时间:2011-06-15 17:38:37

标签: .net visual-c++ c++-cli interop managed-c++

我想用标准的,独立于平台的C ++编写一个算法库。

然后我可以使用相同的C ++代码并为.NET编译它,以便C#应用程序可以使用该库吗? 如果没有,实现这种互操作的最简单方法是什么?

3 个答案:

答案 0 :(得分:5)

您不能直接在C#和标准C ++之间进行接口。但是,您可以在C ++ / CLI包装器中使用C ++库,这使得.NET托管代码(以及C#)中的功能可用。

只需将包装器编写为C ++ / CLI库,公开.NET API并包含标准C ++库中的代码(但遗憾的是,据我所知,这不能静态链接。)

答案 1 :(得分:4)

您可以通过三种方式公开您的库,以便从托管代码轻松调用:

  • 为它编写一个包含public ref class的C ++ / CLI包装器 - C#代码将调用此类的方法,该方法将调用库的本机方法
  • 将库中的C风格函数作为DLL公开 - C#代码将使用P / Invoke来调用函数
  • 在C ++中编写一个使用您的库的COM组件,并通过向其添加COM引用从C#代码中调用它。

第三个,COM,我仅包括完整性。这不是我的第一选择。或者我的第三个。如果COM组件存在则是一回事,为此只写它是另一回事。

在前两个之间,问题是还有谁可以使用这个库。如果C#代码是唯一使用它的人,那就做你喜欢的。但是,例如,您可能有15或20个本机方法设置各种属性,然后是执行实际工作的goexecute方法。因为托管本机互操作有成本,我会告诉你编写一个带有20个参数的C ++ / CLI函数,调用各种本机函数,然后调用goexecute。这为您提供了一个更简洁的界面而不是聊天,并降低了互操作成本。

答案 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();
    }
}