原因主要是由于这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)
你可以做的是创建一个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代码与应用程序分开.希望对此有所了解.
| 归档时间: |
|
| 查看次数: |
50033 次 |
| 最近记录: |