0

我在我正在维护的一个实用程序上运行代码分析,它建议我改变这个:

private static extern int ReadMenu1File(string Menu1Path);

...对此:

private static extern int ReadMenu1File(UnmanagedType.LPWStr Menu1Path);

...使用这种措辞:“为 P/Invoke 字符串参数指定封送处理为了降低安全风险,将参数 'Menu1Path' 封送为 Unicode,方法是将 DllImport.CharSet 设置为 CharSet.Unicode,或将参数显式封送为 UnmanagedType.LPWStr。如果您需要将此字符串编组为 ANSI 或系统相关,请显式指定 MarshalAs,并设置 BestFitMapping=false;为了增加安全性,还要设置 ThrowOnUnmappableChar=true。”

...但是当我这样做时,它说,“类型名称'LPWStr'不存在于类型'System.Runtime.InteropServices.UnmanagedType' ”和“ 'System.Runtime.InteropServices.UnmanagedType.LPWStr'是一个'字段',但用作'类型' "

代码完成没有帮助(在键入“UnmanagedType.”后没有任何建议),也没有上下文菜单选项来添加缺少的使用。

4

2 回答 2

5

你确定它不想让你用[MarshalAs(UnmanagedType.LPWStr)]属性来装饰参数吗?例如:

private static extern int ReadMenu1File(
                            [MarshalAs(UnmanagedType.LPWStr)] string Menu1Path);

UnmanagedType是一个enum,所以你试图使用它的一个成员作为一种类型,这就是编译器抱怨的原因。

于 2013-09-24T17:02:59.323 回答
4

我怀疑你误解了这个建议。我怀疑它实际上是在暗示:

private static extern int ReadMenu1File([MarshalAs(UnmanagedType.LPWStr)]
                                        string Menu1Path);

编辑:这符合建议:

或通过将参数显式编组为UnmanagedType.LPWStr

这与说“将参数类型更改为UnmanagedType.LPWStr”不同 - 它只是告诉您这就是您应该如何编组参数。

其他建议将改为设置[DllImport]

于 2013-09-24T17:03:18.860 回答