我有一个函数在一个DLL中具有以下标识符。C#编组一个const char *从DLL的返回值
const char* function(void)
DLL在堆上分配字符串,并期望它只被读取。我曾尝试以下导入功能,但我得到一个访问冲突
[DllImport("great.dll", CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl)
]
public static extern string function();
如何处理这个正确
错误消息:
System.AccessViolationException:“试图读取或写保护的内存。这往往表明其他内存已经损坏。“
封送拆分器假定DLL在COM堆上分配了字符串,因此在返回的指针上调用CoTaskMemFree。显然,DLL没有这样做。问题是,该字符串是如何分配的?在继续之前,您需要了解这一点。 –
我不这么认为。但是,如果它足够适合你。 –
另请参阅https://docs.microsoft.com/zh-cn/dotnet/framework/interop/default-marshaling-for-strings –