编组P/Invoke

Ele*_*ios 2 c# vb.net pinvoke

VS代码分析器抛出此警告:

CA2101为P/Invoke字符串参数指定编组要降低安全风险,请将参数'buffer'编组为Unicode,方法是将DllImport.CharSet设置为CharSet.Unicode,或者将参数显式封送为UnmanagedType.LPWStr.如果需要将此字符串封送为ANSI或系统相关,请明确指定MarshalAs,并设置BestFitMapping = false; 为了增加安全性,还要设置ThrowOnUnmappableChar = true.Reg2Bat CenteredMSGBox.vb 20

这里:

<DllImport("user32.dll")> _
Shared Function GetClassName(hWnd As IntPtr, buffer As System.Text.StringBuilder, buflen As Integer) As Integer
End Function
Run Code Online (Sandbox Code Playgroud)

我需要使用ANSI编码,但我不明白我需要做什么,所以我需要如何编组呢?

tor*_*rak 9

这是pinvoke.net的声明.

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(
    IntPtr hWnd, 
    StringBuilder lpClassName,
    int nMaxCount
);
Run Code Online (Sandbox Code Playgroud)

如果您(无论出于何种原因)想要导入ASCII版本,那么它看起来就像

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetClassNameA(
    IntPtr hWnd, 
    StringBuilder lpClassName,
    int nMaxCount
);
Run Code Online (Sandbox Code Playgroud)

另一种方法是为各个参数指定编组行为,如

[DllImport("user32.dll", SetLastError = true)]
static extern int GetClassNameA(
    IntPtr hWnd, 
    [MarshalAs(UnmanagedType.LPStr)] StringBuilder lpClassName,
    int nMaxCount
);
Run Code Online (Sandbox Code Playgroud)