将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
约定,则必须使用malloc
和free
。
您将不得不围绕函数调用创建一堆包装类 ,并确保您没有泄漏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(!)对象。 一切都是疯了,……