我刚刚启动了一个C#项目,想要导入一个C ++ .lib及其相应的头文件(.h)。
我读过各种帖子都提到.dll,而不是.lib,这让我感到困惑。
下面的图片显示了我所指的.lib和.h文件,我所做的就是将它们拖入项目中。
有人能指出我更清楚地解释如何做到这一点吗?我相信它不会像看起来那么难。
答案 0 :(得分:9)
原因主要是C++
是非托管语言。 C#
是托管语言。托管和非托管是指语言如何管理内存。
C++
你必须自己做内存管理(分配和释放),C# .NET Framework
使用garbage collector进行内存管理。您必须确保您拨打new
的所有地点,必须致电delete
,同样适用于malloc
和free
如果您使用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(!)对象。一切都是疯了,......