繁体   English   中英

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

[英]Import a C++ .lib and .h file into a C# project?

我刚开始一个C#项目,想导入一个C ++ .lib及其对应的头文件(.h)。

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

下图显示了我所引用的.lib和.h文件,我所做的只是将它们拖到项目中。

在此处输入图片说明

谁能指出我要如何做的更清晰的解释? 我敢肯定它不会像看起来那样难。

不幸的是,这是一个不平凡的问题。

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

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

在您的库代码中

必须确保调用new所有位置,必须调用delete ,并且如果使用C约定,则mallocfree同样适用。

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

问题

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

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

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

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

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

接下来,创建一个新类(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代码与应用程序分开。 希望对此有所了解。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM