4

私のコードは次のネイティブメソッドをインポートします:

  • DeleteObjectGetFontDataおよびSelectObjectgdi32.dllから
  • GetDCおよびReleaseDCuser32.dllから

完全および中程度の信頼環境でコードを実行したい(これらのインポートされたメソッドが中程度の信頼環境で間接的に使用される場合に例外がスローされることを除いて、問題ありません)。

コードに対してコード分析を実行すると、次のような警告が表示されます。

CA5122 P/Invoke宣言はセーフクリティカルであってはなりません。

P/Invokeメソッド' GdiFont.DeleteObject(IntPtr)'はセーフクリティカルとマークされています。P / Invokesはクリティカルコードによってのみ呼び出される可能性があるため、この宣言はセキュリティクリティカルとしてマークするか、誤解を招くことを避けるためにアノテーションを完全に削除する必要があります。

誰かが私に(素人の言葉で)この警告が本当に何を意味するのか説明してもらえますか?

これらのインポートを内部静的メソッドとして静的クラスに入れてみましSafeNativeMethodsたが、警告が消えることはありません。

この記事NativeMethodsを読んだ後、中程度の信頼の環境でコードを完全に使用できなくしたくないので、それが正しい方法であるかどうかわからないため、それらを入れようとしませんでした(これは移動の結果になると思いますにインポートします)。NativeMethods

正直なところ、私は警告の本当の意味とそれを抑制するためのさまざまなオプションの結果についてかなり混乱しています。

誰かがこれすべてに光を当てることができますか?

編集:

私のコードは.NET2.0フレームワークをターゲットにしています。

アセンブリはでマークされています

[assembly: AllowPartiallyTrustedCallers]

メソッドは次のように宣言されます。

[DllImport("gdi32")]
internal static extern int DeleteObject(HANDLE hObject);
4

1 に答える 1

4

これは、このバグの発生である可能性が最も高いです。P/Invoke宣言に関する偽のCA5122警告は、安全性が重要ではないはずです。これは、NET4より前のアセンブリで明らかになります。

于 2012-11-22T16:58:32.953 に答える