P / Invoke声明不应该是安全关键的

时间:2012-11-21 17:45:45

标签: c# interop pinvoke code-analysis

我的代码按照原生方法导入:

    来自gdi32.dll 的
  • DeleteObjectGetFontDataSelectObject 来自user32.dll的
  • GetDCReleaseDC

我想在完全和中等信任环境中运行代码(当在中等信任环境中间接使用这些导入的方法时,抛出异常,我很好。)

当我对代码运行代码分析时,我收到警告:

  

CA5122 P / Invoke声明不应该是安全关键的。

     

标记了P / Invoke方法“GdiFont.DeleteObject(IntPtr)”   安全关键。由于P / Invokes只能由关键代码调用,   此声明应标记为安全关键,或具有   它的注释完全删除,以避免误导。

有人可以解释我(用外行人的话说)这个警告到底意味着什么?

我尝试将这些导入作为内部静态方法放在静态SafeNativeMethods类中,但这并不会使警告消失。

我没有尝试将它们放在NativeMethods中,因为在阅读this article之后我不确定这是正确的方法,因为我不希望我的代码在中等信任中完全无法使用环境(我认为这是将导入转移到NativeMethods)的结果。

老实说,我对这种警告的真正含义以及不同选择抑制警告的后果感到困惑。

有人可以对这一切有所了解吗?

编辑:

我的代码目标是.NET 2.0框架。

程序集标有

[assembly: AllowPartiallyTrustedCallers]

方法声明如下:

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

1 个答案:

答案 0 :(得分:4)

这很可能是这个错误Bogus CA5122 warning about P/Invoke declarations should not be safe-critical的出现,它出现在NET4之前的程序集中。