2017-09-04 3 views
0

Ich habe Fehler CA2122 DoNotIndirectlyExposeMethodsWithLinkDemands zu dieser Funktion:CA2122 DoNotIndirectlyExposeMethodsWithLinkDemands

internal static string GetProcessID() 
     { 

       return Process.GetCurrentProcess().Id.ToString(CultureInfo.CurrentCulture); 

     } 

Wie es zu beheben?

+0

Es widerspricht dem Aufruf von 'GetCurrentProcess'. Warum möchten Sie gerade die aktuelle Prozess-ID erhalten? Da dies derzeit die * ganze * Arbeit dieser Methode ist (außerhalb der fragwürdigen Umwandlung in eine Zeichenfolge), ist es schwierig, eine Ersetzung zu empfehlen. –

Antwort

2

Ich habe Fehler CA2122

Es ist kein Fehler, nur eine Warnung. Das Code-Analyse-Tool, das Sie verwenden, überprüft für viele obskure Corner-Fälle, die Art, dass der C# -Compiler nicht über, sondern eine schlechte Praxis ist. Und die Art, der Programmierer oft nicht bewusst sind. Es wurde ursprünglich als internes Tool entwickelt, das von Microsoft-Programmierern verwendet wird, die an Framework-Code arbeiten. Die Regeln, denen sie folgen müssen, sind ziemlich drakonisch, da sie nicht vorhersagen können, wie ihr Code verwendet wird.

... WithLinkDemands

Ein Link Nachfrage Code Access Security (CAS) Detail. Es stellt sicher, dass der Code über ausreichende Rechte zur Ausführung verfügt. Link-Anforderungen sind sehr günstig, sie werden nur einmal überprüft, wenn der Code Just-in-Time kompiliert wird. Die "nur einmal" -Klausel ist das, worüber die Warnung spricht. Es ist technisch möglich, dass Code, der über ausreichende Rechte verfügt, zuerst ausgeführt werden kann, so dass die Methode aktiviert werden kann, später aber von nicht vertrauenswürdigem Code verwendet wird, wodurch die Prüfung umgangen wird . Das Tool geht davon aus, dass diese möglicherweise passieren, weil die Methode öffentlich ist, weiß es nicht, dass dies tatsächlich in Ihrem Programm passiert.

return Process.GetCurrentProcess() ...

Es ist der Prozess-Klasse, die die Verbindung Nachfrage hat. Sie können von der MSDN article sagen, die es verlangt. Es überprüft, ob der aufrufende Code vollständig vertrauenswürdig ausgeführt wird, dass er nicht auf einem restriktiven nicht verwalteten Host wie SQL Server ausgeführt wird und dass eine abgeleitete Klasse diese Anforderungen ebenfalls erfüllt. Die Process-Klasse ist ein wenig riskant, nicht vertrauenswürdiger Code könnte böse Dinge tun, indem er einen Prozess startet, um CAS-Prüfungen zu umgehen oder zu viel über den Prozess zu erfahren, in dem er läuft, und an seiner Konfiguration bastelt.

Wie es zu beheben?

Mehr als ein möglicher Ansatz. Ungefähr in der Reihenfolge:

  1. Immer hohe Chancen, dass diese Warnung nur nicht für Ihr Programm gilt. Mit anderen Worten, es besteht kein Risiko, dass Code jemals ausgeführt wird, dem Sie nicht vertrauen. Ihr Programm müsste Plug-Ins unterstützen, die von Programmierern geschrieben wurden, die Sie nicht kennen, aber dennoch Zugriff auf den Computer haben, um Ihrem Programm mitzuteilen, dass es sein Plug-In laden soll. Nicht sehr häufig. Der richtige Ansatz besteht dann darin, das Tool so zu konfigurieren, dass es dem Verhalten Ihres Programms entspricht. Sie würden die Regel deaktivieren.

  2. Bewerten Sie das Risiko von nicht vertrauenswürdigem Code mit dieser Methode. Das sollte für diese spezielle Methode ein niedriger Wert sein, da die Prozess-ID keine wesentlichen Geheimnisse preisgibt. Es ist nur eine Zahl, es wird keine riskante Zahl, bis es von Code verwendet wird, der Process.GetProcessById() verwendet. Wenn Sie die Warnung unterdrücken möchten, wenden Sie die Methode [SuppressMessage] attribute auf die Methode an. Dies ist ein allgemeines Ergebnis, der Framework-Quellcode hat viele und viele von ihnen.

  3. Folgen Sie den Anweisungen des Tools und wenden Sie die CAS-Attribute auch auf diese Methode an. Einfach ein Kopieren-Einfügen aus dem Link fordert Sie in den MSDN-Artikel gesehen. Dies schließt die Lücke "nur einmal", der nicht vertrauenswürdige Code wird nun nicht mehr jit und kann nicht ausgeführt werden.