gpt4 book ai didi

c# - 如何自动将 const wchar_t* 从 C DLL 转换为 C# 字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:24 25 4
gpt4 key购买 nike

这只是好奇。或许这个世界上有这样的人做过这样的事:

我必须导出 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();

提前感谢您提供任何信息或有用的链接、示例和书籍。同样,这只是一种好奇心。

附言使用 PtrToStringUni 将结果转换为字符串的单独函数包装 SysGetLibInfo 的建议不是一个选项;)

最佳答案

您不能覆盖 MarshalAs,但您可以改用自定义编码

http://msdn.microsoft.com/en-us/library/w22x2hw6.aspx

  [DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(MyMarshaller))]
private static extern string SysGetLibInfo();

关于c# - 如何自动将 const wchar_t* 从 C DLL 转换为 C# 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16833219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com