我的代码按照原生方法导入:
DeleteObject
,GetFontData
和SelectObject
来自user32.dll的GetDC
和ReleaseDC
我想在完全和中等信任环境中运行代码(当在中等信任环境中间接使用这些导入的方法时,抛出异常,我很好。)
当我对代码运行代码分析时,我收到警告:
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);
答案 0 :(得分:4)
这很可能是这个错误Bogus CA5122 warning about P/Invoke declarations should not be safe-critical的出现,它出现在NET4之前的程序集中。