我目前正在探索 C# 中的 DLL 导出函数和 P/invoke。我创建了非常简单的 .dll:
测试.h
#ifndef TEST_DLL_H
#define TEST_DLL_H
extern "C" __declspec(dllexport) const char * __cdecl hello ();
extern "C" __declspec(dllexport) const char * __cdecl test ();
#endif // TEST_DLL_H
测试.cpp
#include <stdlib.h>
#include "test.h"
#include <string.h>
const char* hello()
{
char *novi = (char *)malloc(51);
strcpy(novi, "Test.");
return novi;
}
const char * test()
{
return "Test.";
}
我已经编译它并在 C# 项目中使用,如下所示:
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr hello();
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string test();
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(test());
IntPtr a = hello();
MessageBox.Show(Marshal.PtrToStringAnsi(a));
}
但它不起作用。test()
被成功调用,我得到了正确的字符串。但hello()
只是挂断程序。如果我从hello()
定义中删除 malloc 行并返回常量,一切正常,所以我想我现在知道 malloc 存在问题。
另外,我在某处看到返回类型为 char* 时不应使用该字符串。如果这是真的,我们为什么要使用 IntPtr?