创建要从 .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的调试

.NET CORE 热更新,否则提示DLL文件在使用中

将 C++ DLL 添加到 C# 项目

从 .Net Dll 创建 .Ocx 文件

在 C++/CLI 中使用时未创建 C# 应用程序 log4net 日志文件

如何设计一个包装类来使用 C++ 应用程序以使用 C# DLL?