将C ++ .lib和.h文件导入C#项目?

时间:2013-08-09 15:32:19

标签: c# c++ import header .lib

我刚刚启动了一个C#项目,想要导入一个C ++ .lib及其相应的头文件(.h)。

我读过各种帖子都提到.dll,而不是.lib,这让我感到困惑。

下面的图片显示了我所指的.lib和.h文件,我所做的就是将它们拖入项目中。

enter image description here

有人能指出我更清楚地解释如何做到这一点吗?我相信它不会像看起来那么难。

3 个答案:

答案 0 :(得分:9)

不幸的是,这是一个非常重要的问题。

原因主要是C++非托管语言C#托管语言。托管和非托管是指语言如何管理内存。

  • C++你必须自己做内存管理(分配和释放),
  • C# .NET Framework使用garbage collector进行内存管理。

在您的图书馆代码

必须确保您拨打new的所有地点,必须致电delete,同样适用于mallocfree如果您使用C惯例。

您必须围绕函数调用创建一堆包装类,并确保不会泄漏C++代码中的任何内存。

问题

您的主要问题(据我所知)您将无法直接在C#中调用这些功能,因为您无法将非托管代码静态链接到托管代码。< / p>

您必须编写一个.dll来包装C++中的所有库函数。完成后,您可以使用C#互操作功能从dll调用这些功能。

[DllImport("your_functions.dll", CharSet = CharSet.Auto)]
public extern void your_function();

答案 1 :(得分:8)

您可以做的是创建C ++ / CLI包装器并通过包装器公开要使用的lib的功能。您可以在C#项目中轻松引用创建的包装器DLL。这当然需要一些工作来创建托管/非托管包装器,但从长远来看会有所回报。

要在C ++项目模板CLR和类库下创建托管C ++项目,请选择此项。在这里,您可以链接到您的lib,使用您习惯的头文件。

接下来创建一个新类(ref类)并将库包装在其中。示例可能如下所示:

LibHeader.h

int foo(...);

你写一个这样的包装类: 部首:

Wrapper.h

public ref class MyWrapper
{
    public:
        int fooWrapped();
};

您的实施:

Wrapper.cpp

#include Libheader.h

int MyWrapper::fooWrapped()
{
     return foo();
}

为简单起见,省略了命名空间和所有好东西。 现在,您可以在C#代码中使用MyWrapper,就像任何其他托管类一样简单。当然,当lib的接口变得更复杂时,你必须考虑更多,但它可能有助于将lib代码与应用程序分开。希望对此有所了解。

答案 2 :(得分:4)

它“看起来很难”。 C ++和C#是矛盾的。第一个是确定性破坏,第二个没有。现在,你编写C ++ / cli将破坏延迟到垃圾收集器调用的一些终结器,垃圾收集器在它自己的线程中工作,引入了各地的问题(线程安全,C ++成员(在c ++ / cli中使用)是否有效?,... )。更糟糕的是,GC可能会建议C ++对象很小(一个指针)并引发一种内存泄漏(由于后期解除分配微小对象)。基本上,您最终在C ++ / cli GC之上编写GC以删除主线程中的非C ++ / cli(!)对象。一切都是疯了,......