从c#调用c ++库

时间:2010-06-02 14:00:35

标签: c# c++ unmanaged

这个问题似乎与之前的问题重复。我已阅读了一系列帖子,但对我的情况并不完全清楚。

我有一个使用momentics IDE创建的c ++库。我必须能够将这个库用于c#项目。

在交给我之前,有人一直在研究这个项目。目前,有2层可以实现这一目标。首先,c ++项目包括带有c ++包装器的完整库。该项目创建一个dll作为输出。然后将这个c ++ dll输入到一个c#项目,该项目具有对c ++ dll的dllimport调用。这个c#项目再次创建一个dll。最后,为了在c#应用程序中使用库,我必须包含对这两个dll的引用。

这是使其正常工作的正确方法吗?我想可能应该有办法简化这个过程。

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:7)

鉴于您正在使用C ++库,我假设它利用了类似C ++的语义,而不仅仅是暴露程序。如果是这种情况,那么通常通过手动创建的托管C ++互操作库来完成此操作。

基本上,您在Visual Studio中创建托管C ++库,引用现有的C ++库,并围绕现有C ++类创建托管包装器。然后,在C#项目中引用此(托管)C ++程序集,并在C#程序集中包含原始(非托管)C ++库,就像放置在构建目录中的文件一样。

这是必需的,因为无法通过P / Invoke(DllImport)调用引用C ++类等内容。

如果您的基础库只是一系列函数,那么您可以通过P / Invoke函数直接在C#项目中引用它。

无论哪种方式,都必须包含上面提到的所有库(第一个,非托管C ++库,托管C ++程序集和C#项目,或者第二个,非托管C ++库和C#项目)在任何引用它们的项目中。您无法将非托管库静态链接到托管程序集。

答案 1 :(得分:2)

似乎你有一个太多的包装器,但也许有人正在实现某种外观或添加属性或东西。托管和非托管之间的基本连接将是“平面”函数调用的DllImport - 不是成员函数 - 或C ++ / CLI代码调用成员函数。如果包装器是C ++ / CLI,那么它最容易编写(只包括C ++库的头文件)并且最容易调用(C#代码只是添加一个.NET引用并继续正常运行)因此它将是我的第一选择该项目有C ++专业知识。

听起来,无论你接管谁,都是艰难的做法。如果方法少于20个,我建议重新开始。

答案 2 :(得分:0)

可以使用:

  

DllImport

class Example
{
    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}