创建要从 .NET 使用的 C++ DLL 的提示
Posted
技术标签:
【中文标题】创建要从 .NET 使用的 C++ DLL 的提示【英文标题】:Tips on creating a C++ DLL to be used from .NET 【发布时间】:2010-07-02 14:22:03 【问题描述】:大家好,我正在用 C++ 创建一个 DLL,我希望它可以在 .NET 应用程序(C# 和 VB.NET)中使用。我一直在互联网上搜索提示,到目前为止我发现的建议是:
将我的 C++ 函数声明为 extern C 并使用 __stdcall 使用基本的 C 类型作为参数和返回类型而不是 STL 容器(例如 char* 而不是 std::string) 对需要修改的输入参数使用指针而不是引用假设 typedef 为 unsigned char 字节;
这是一个压缩函数。它期望的输入是输入数据(作为 byte* 传递)、输入数据的大小(作为 int 传递)、指向存储压缩大小的变量的指针(作为 int* 传递)和一个字符串如果需要,可以存储哪些错误消息(作为 char* 传递)。函数 malloc 的输出缓冲区,写入输出,并返回一个字节*,调用代码应该在使用完缓冲区后释放缓冲区。万一发生错误,错误信息会被 strcpy'd 到错误字符串中,并返回一个 NULL 指针。
我当前的设置是否正确,或者我是否需要进行一些其他修改才能从 .NET 调用它?
【问题讨论】:
【参考方案1】:托管代码无法释放内存,它无权访问 CRT 中内置的分配器。您可以使用 CoTaskMemAlloc() 来分配缓冲区,托管代码可以调用 Marshal.FreeCoTaskMem()。您必须将缓冲区指针参数声明为“ref IntPtr”或将函数的返回类型声明为 IntPtr。这给托管代码带来了将其转换为托管字节数组的麻烦。
这并不漂亮,当你用 C++/CLI 编写代码或编写 COM 服务器时,这些问题就消失了。
【讨论】:
以上是关于创建要从 .NET 使用的 C++ DLL 的提示的主要内容,如果未能解决你的问题,请参考以下文章
在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试