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

4
我的代码导入以下本地方法:
  • 来自gdi32.dll的DeleteObjectGetFontDataSelectObject
  • 来自user32.dll的GetDCReleaseDC
我希望在完全信任和中等信任环境下运行代码(当这些导入的方法在中等信任环境下间接使用时,我可以接受抛出异常)。
当我对代码进行代码分析时,我会收到警告,例如:

CA5122 P/Invoke declarations should not be safe-critical.

P/Invoke method 'GdiFont.DeleteObject(IntPtr)' is marked safe-critical. Since P/Invokes may only be called by critical code, this declaration should either be marked as security critical, or have its annotation removed entirely to avoid being misleading.

有人能用通俗易懂的语言解释一下这个警告的真正含义吗?
我尝试将这些导入放入静态的SafeNativeMethods类中作为内部静态方法,但这并不能消除警告。
我没有尝试将它们放入NativeMethods中,因为在阅读了这篇文章之后,我不确定这是正确的方法,因为我不想让我的代码在中等信任环境下完全无法使用(我认为这将是将导入移动到NativeMethods的后果)。
老实说,我非常困惑这个警告的真正含义以及抑制它的不同选项的后果。
有人能给我解释一下吗?
编辑:
我的代码针对.NET 2.0框架。
程序集标记为
[assembly: AllowPartiallyTrustedCallers]

方法的声明方式如下:

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

你的目标框架是什么?这是否适用于http://connect.microsoft.com/VisualStudio/feedback/details/729254/bogus-ca5122-warning-about-p-invoke-declarations-should-not-be-safe-critical?该程序集的安全属性是什么? - fsimonazzi
@fsimonazzi 请查看我问题的更新。不幸的是,我不确定这个错误报告是否适用于我的情况。 - Bobrovsky
你为什么认为它不适用?因为它提到了3.5吗?我认为它不应该对3.5触发的论点(但实际上它却触发了)同样适用于2.0。 - fsimonazzi
@fsimonazzi 我认为你是正确的,这个错误报告也适用于我的2.0程序集。我想我应该只是忽略这个警告,对吗? - Bobrovsky
@fsimonazzi,您能否将您的评论总结成一个答案,这样我就可以接受它了吗? - Bobrovsky
1个回答

4

2
链接中的错误报告似乎已经消失了。 - ardila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接