0

私が保守しているユーティリティでコード分析を実行したところ、これを変更するようにアドバイスされました。

private static extern int ReadMenu1File(string Menu1Path);

...これに:

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

...この言い回しで:「P/Invoke 文字列引数のマーシャリングを指定してください。セキュリティ リスクを軽減するには、DllImport.CharSet を CharSet.Unicode に設定するか、パラメータを UnmanagedType.LPWStr として明示的にマーシャリングして、パラメータ 'Menu1Path' を Unicode としてマーシャリングします。この文字列を ANSI またはシステム依存としてマーシャリングする必要がある場合は、MarshalAs を明示的に指定し、BestFitMapping=false を設定します。セキュリティを強化するには、ThrowOnUnmappableChar=true も設定してください。"

...しかし、私が行ったとき、「型名「LPWStr」は型「System.Runtime.InteropServices.UnmanagedType」に存在しません」および「「System.Runtime.InteropServices.UnmanagedType.LPWStr」は「です」と表示されますフィールド」ですが、「タイプ」のように使用されます

コード補完は役に立ちません (「UnmanagedType.」と入力した後の提案はありません) また、不足している using を追加するコンテキスト メニュー オプションもありません。

4

2 に答える 2

5

[MarshalAs(UnmanagedType.LPWStr)]パラメーターを属性で装飾することを望んでいなかったのですか? 例えば:

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

UnmanagedTypeは であるenumため、そのメンバーの 1 つを型として使用しようとしています。これが、コンパイラが不平を言っている理由です。

于 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 に答える