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
我需要使用ANSI编码,但我不明白我需要做什么,所以我需要如何编组呢?
答案 0 :(得分:9)
以下是pinvoke.net的声明。
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(
IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount
);
如果您(无论出于何种原因)想要导入ASCII版本,那么它看起来像
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetClassNameA(
IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount
);
另一种方法是为
中的各个参数指定编组行为[DllImport("user32.dll", SetLastError = true)]
static extern int GetClassNameA(
IntPtr hWnd,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder lpClassName,
int nMaxCount
);