我在此函数上遇到错误CA2122 DoNotIndirectlyExposeMethodsWithLinkDemands:
internal static string GetProcessID()
{
return Process.GetCurrentProcess().Id.ToString(CultureInfo.CurrentCulture);
}
如何解决?
答案 0 :(得分:2)
我收到错误CA2122
这不是一个错误,只是一个警告。您正在使用的代码分析工具检查了许多模糊的角落案例,C#编译器没有抱怨但可能是一种不好的做法。程序员通常不知道的那种。它最初设计为Microsoft程序员使用框架代码时使用的内部工具。他们必须遵循的规则非常严格,因为他们无法预测他们的代码将如何被使用。
... WithLinkDemands
链接需求是代码访问安全性(CAS)详细信息。它确保代码具有足够的执行权限。链接需求非常便宜,它们只检查一次,在代码即时编译时发生。 “only-once”子句是警告所说的内容,技术上可以使代码具有足够的权限首先执行,从而允许方法被jitted,但后来被非信任代码使用,从而绕过了检查。该工具只是假设此可能发生,因为该方法是公开的,它不知道这实际发生在您的程序中。
返回Process.GetCurrentProcess()...
具有链接需求的Process类。你可以从MSDN article告诉它有什么要求。它验证调用代码是否完全信任,它不在像SQL Server这样的限制性非托管主机中运行,并且派生类也满足这些要求。 Process类有点冒险,不受信任的代码可以通过启动一个绕过CAS检查的过程或者过多了解它运行的过程并修改其配置来做顽皮的事情。
如何解决?
不止一种可能的方法。大致顺序:
此警告不一定适用于您的程序。换句话说,它不存在执行您不信任的代码的风险。您的程序必须支持由您不了解但仍可访问该计算机的程序员编写的插件,以告知您的程序加载其插件。不太常见。然后,正确的方法是配置工具以匹配您的程序的行为,您将禁用该规则。
使用此方法评估不受信任的代码的风险。对于这种特定的方法,这应该是低的,暴露进程ID不会泄露任何重大秘密。它只是一个数字,在使用Process.GetProcessById()的代码使用之前,它不会成为一个有风险的数字。因此,您可以考虑取消警告,将[SuppressMessage] attribute应用于该方法。这是一个常见的结果,框架源代码有很多很多。
按照工具的建议,将CAS属性也应用于此方法。只需从链接中复制粘贴,就可以在MSDN文章中看到。这关闭了“只有一次”的漏洞,不受信任的代码现在无法jit而无法执行。