P /在C#中调用C ++类

时间:2012-05-29 07:21:56

标签: c# .net mono pinvoke

我想在C#应用程序中使用rasterbar libtorrent。它是用非托管C ++编写的。

我刚才使用DLL并在线发现了这篇文章:How to Marshal a C++ Class

它描述了直接编组/调用C ++类是不可能的,你必须用C(或托管C ++)编写一个桥,以便在托管C#代码中使用该库。

这篇文章是从2007年开始的,我想知道现在是否有更好的解决方案来使用C ++ DLL。我正在寻找可在Mono平台上运行的解决方案。 libtorrent是跨平台的,所以它应该是可能的。

1 个答案:

答案 0 :(得分:2)

首先,你应该为windows构建 libtorrent dll。 This link here可以帮到你。然后,要从托管代码(在本例中为C#)中调用未托管代码(在本例中为C ++),您可以使用Platform Invocation Services (PInvoke)。它允许托管代码调用DLL中实现的非托管函数。例如,看看这个MSDN代码

// PInvokeTest.cs
using System;
using System.Runtime.InteropServices;

class PlatformInvokeTest
{
    [DllImport("msvcrt.dll")]
    public static extern int puts(string c);
    [DllImport("msvcrt.dll")]
    internal static extern int _flushall();

    public static void Main() 
    {
        puts("Test");
        _flushall();
    }
}

更好的方法是在C#中为 libtorrent dll编写一个包装类,使用PInvoke包装它的方法并在整个项目中使用包装器。