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

CA2101: Specify marshaling for P-Invoke string arguments

我正在尝试向 C# (dotnet 5.0) 公开一个采用 UTF-8 字符串的 C 函数。我得到一个 warning ,这对我来说没有意义。这是重现它的简单方法,使用 fopen(3):

[DllImport("libc.so.6", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr fopen([MarshalAs(UnmanagedType.LPUTF8Str)] string pathname, string mode);

Visual Studio 2019 正在报告警告:

从文档来看,我的情况似乎需要设置 CharSet.Ansi

并使用 UnmanagedType.LPUTF8Str:

我对文档有什么误解?

从技术上讲,这有点重复:

建议添加BestFitMapping = false, ThrowOnUnmappableChar = true

在我的例子中,建议的代码 'Show potential fixes' ([MarshalAs(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);