[c#]调用 C DLL 函数封送从 char 类型定义的字符串

标签: dll C#
发布时间: 2013/12/1 21:21:38
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这是我第一次尝试在创建一个 C# 包装到 C lib。SDK 是三党内外我的控制:

sdk_defines.h

#ifndef SDK_CHAR_T
#define SDK_CHAR_T
typedef char sdk_char_t;
#endif /* SDK_CHAR_T */

#ifndef SDK_CSTR_T
#define SDK_CSTR_T
typedef const sdk_char_t*  sdk_cstr_t;
#endif /* SDK_CSTR_T */

sdk.h

sdk_cstr_t SDK_API
sdk_get_version(void);

我的 C# 包装:

[DllImport("sdk.dll", CharSet = CharSet.Ansi)]
private static extern string sdk_get_version();

任何对 sdk_get_version 的调用会导致崩溃,不例外。我有种感觉它的返回类型,但怎么做我正确地封它在 C# 中吗?

解决方法 1:

如果你将作为返回 string ,然后封送处理程序将调用 CoTaskMemFree 将返回的指针上。我期望的是什么发生在你身上,就是为什么您的代码将失败。看那 API,它似乎是最有可能的当然不是用分配的指针的返回点到一个字符串文本在 DLL 中, CoTaskMemAlloc

所以,你要需要返回,作为 IntPtr 然后将转换为字符串使用 Marshal.PtrToStringAnsi

所以你需要它,像这样:

[DllImport("sdk.dll")]
private static extern IntPtr sdk_get_version();

....

IntPtr ptr = sdk_get_version();
string version = Marshal.PtrToStringAnsi(ptr);

你走了很多之前你需要进一步工作出什么 SDK_API 是。它是 stdcall 或者是 cdecl 吗?它没有区别对于这个无参数的函数,但之前很久就会传递的参数,以及你需要知道。

赞助商