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

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

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

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

在此处输入图像描述

任何人都能指出我更清楚地解释如何去做这件事吗? 我敢肯定它不会像看起来那么难。

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

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

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

LibHeader.h int foo(...); 

你编写一个这样的包装类:Header:

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

你的实施:

 Wrapper.cpp #include Libheader.h int MyWrapper::fooWrapped() { return foo(); } 

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

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

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

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

在您的库代码中

必须确保调用new所有位置都必须调用delete ,如果使用C约定,则必须使用mallocfree

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

问题

您的主要问题(据我所知)是您无法在C#直接调用这些函数,因为您无法将非托管代码静态链接到托管代码

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

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

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