C# CA2101:指定P-Invoke字符串参数的封送处理
我试图公开一个C函数,它将UTF-8字符串转换为C#(dotnet 5.0)。我得到了一份对我来说毫无意义的工作。下面是使用fopen(3)复制它的简单方法: Visual Studio 2019正在报告一个警告: 从文档中可以看出,在我的情况下,似乎需要设置C# CA2101:指定P-Invoke字符串参数的封送处理,c#,character-encoding,pinvoke,C#,Character Encoding,Pinvoke,我试图公开一个C函数,它将UTF-8字符串转换为C#(dotnet 5.0)。我得到了一份对我来说毫无意义的工作。下面是使用fopen(3)复制它的简单方法: Visual Studio 2019正在报告一个警告: 从文档中可以看出,在我的情况下,似乎需要设置CharSet.Ansi: 并使用UnmanagedType.LPUTF8Str: 我从文档中误解了什么?从技术上讲,这有点重复: 这建议添加BestFitMapping=false,throwonnomappablec
CharSet.Ansi
:
UnmanagedType.LPUTF8Str
:
我从文档中误解了什么?从技术上讲,这有点重复:
BestFitMapping=false,throwonnomappablechar=true
在我的例子中,建议的代码“显示潜在修复”([Marshallas(UnmanagedType.LPWStr)]
)只是假的(但这是另一个问题)
所以正确的解决方案是:
[DllImport("libc.so.6", CharSet = CharSet.Ansi, ExactSpelling = true, BestFitMapping = false, ThrowOnUnmappableChar = true, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr fopen([MarshalAs(UnmanagedType.LPUTF8Str)] string pathname, string mode);
[DllImport("libc.so.6", CharSet = CharSet.Ansi, ExactSpelling = true, BestFitMapping = false, ThrowOnUnmappableChar = true, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr fopen([MarshalAs(UnmanagedType.LPUTF8Str)] string pathname, string mode);