C# CA2101:指定P-Invoke字符串参数的封送处理

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

我试图公开一个C函数,它将UTF-8字符串转换为C#(dotnet 5.0)。我得到了一份对我来说毫无意义的工作。下面是使用fopen(3)复制它的简单方法:

Visual Studio 2019正在报告一个警告:

从文档中可以看出,在我的情况下,似乎需要设置
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);