这只是一种好奇心。或许这个世界上有一个人做过这样的事情:
我必须导出 C 函数并通过 DllImport 从 C# 代码加载它
const wchar_t * SysGetLibInfo() {
return dllmanager.SysGetLibInfo();
}
最好的方法是声明 IntPtr,然后使用某些函数将其转换为字符串,并且被广泛推荐。换句话说,像这样
[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr SysGetLibInfo();
// ...
Marshal.PtrToStringUni(SysGetLibInfo());
这种方法有效。但是有没有办法自动做到这一点?让 SysGetLibInfo 返回一个字符串?我发现了一些这样的建议:
[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.LPWStr)]
private static extern string SysGetLibInfo();
但它不起作用,根据各种例子和很少的报告,它不应该起作用。
有没有办法编写我自己的属性,比如 MarshalAs,它将 IntPtr 转换为字符串?与此类似的东西:
[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
[return: MyOwnMarshalPtrToStringUni]
private static extern string SysGetLibInfo();
提前感谢您提供任何信息或有用的链接、示例、书籍。同样,这只是一种好奇心。
PS 建议使用单独的函数包装 SysGetLibInfo,该函数使用 PtrToStringUni 将结果转换为字符串不是一种选择;)