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

Dan*_*mer 24 c# c++ import header .lib

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

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

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

在此输入图像描述

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

Kir*_*kus 9

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

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

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

在您的库代码中

必须确保你打电话的所有地方new,必须打电话delete,malloc并且free如果你正在使用这些C约定.

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

问题

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

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

[DllImport("your_functions.dll", CharSet = CharSet.Auto)]
public extern void your_function();
Run Code Online (Sandbox Code Playgroud)


S. *_*rws 8

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

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

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

LibHeader.h

int foo(...);
Run Code Online (Sandbox Code Playgroud)

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

Wrapper.h

public ref class MyWrapper
{
    public:
        int fooWrapped();
};
Run Code Online (Sandbox Code Playgroud)

你的实施:

Wrapper.cpp

#include Libheader.h

int MyWrapper::fooWrapped()
{
     return foo();
}
Run Code Online (Sandbox Code Playgroud)

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