2010-06-16 9 views
42

Ich habe eine Klasse, die von Exception erbt. In .NET 4, begann ich einen Laufzeitfehler empfangen:Vererberungssicherheitsregeln beim Überschreiben von Membern verletzt - SecurityRuleSet.Level2

Inheritance security rules violated while overriding member: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

ich glaube, das Problem durch die Tatsache verursacht wird, dass ich GetObjectData bin überschreiben.

ich eine Antwort kennen das Problem zur Lösung ist es, die SecurityRuleSet einzustellen:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

Dies ist keine akzeptable Antwort, ich möchte wissen, wie das Problem zu beheben, ohne die Standardsicherheits zum Entspannen mit Regeln in .NET 4.

Antwort

32

Mark GetObjectData mit SecurityCriticalAttribute, weil es auf Exception.GetObjectData angewendet wird. Ein überschriebenes Mitglied sollte die gleiche Sicherheitszugänglichkeit haben (kritisch, sicher kritisch oder transparent).

Lesen Sie Security Changes in the .NET Framework 4 und Security Transparent Code, Level 2 von MSDN für weitere Informationen.

Um alle möglichen Sicherheitslaufzeitausnahmen zu vermeiden, aktivieren Sie die Codeanalyse mit dem Sicherheitsregelsatz. Sie erhalten statische Analysewarnungen, die möglicherweise Laufzeitfehlern entsprechen.

+3

Cool, das hat funktioniert! Ich hatte das tatsächlich versucht, aber ich habe das Attribut auf Klassenebene und nicht auf Mitgliedsebene angewendet. –

+1

Ich versuche dies auf InitializeLifeTimeService zu tun und es will nicht funktionieren, wird der gleiche Fehler. – adriaanp

+0

Wie mache ich das? Kannst du etwas Code zeigen? – brainmurphy1

11

In Bezug auf diesen Fehler in Shared Hosting-Umgebungen, die vollständige vertrauenswürdige Anwendungen ermöglichen. Wenn Sie eine Anwendung bereitstellen, überschreiben Sie häufig web.config. Unter IIS, wenn Sie die Beglaubigungseinstellungen auf etwas anderes als die Standardeinstellung ändern, wird Ihre Web-Config Abschnitt mit geändertem:

<system.web> 
    <trust level="Full" /> 
<system.web> 

eine neue web.config Kopieren Sie diese Einstellung während des Einsatzes häufig überschreibt, wird immer noch Admin jedoch IIS zeigen die Site als "Full Trust", wenn die Site in Wirklichkeit in der Standardvertrauensstufe für Ihren Shared-Host-Provider (normalerweise Medium) ausgeführt wird.

Sie werden diesen Fehler sehen und tun, was ich getan habe - versuchen Sie herauszufinden, warum Sie es sehen würden, obwohl Sie wissen, dass die Website unter voller Vertrauenswürdigkeit läuft, obwohl es in Wirklichkeit nicht funktioniert. Die Lösung besteht darin, Ihre Webkonfiguration wie oben beschrieben vor der Bereitstellung zu ändern oder mithilfe von IIS-Admin die Site auf eine andere Vertrauensstufe (beispielsweise hoch) zu setzen, sie anzuwenden und dann auf die volle Größe zurückzusetzen. Dadurch werden die erforderlichen Konfigurationsdateiinformationen erneut eingefügt und der Anwendungspool vollständig vertrauenswürdig neu gestartet.

17

hatte dieses Problem, wenn ich eine Versammlung rief die AllowPartiallyTrustedCallers Attribut hatte:

[assembly: System.Security.AllowPartiallyTrustedCallers] 

entfernen, ohne die Umstellung auf SecurityRuleSet.Level1 mein Problem gelöst.

+0

Dies war eine schnelle und dreckige Korrektur, um die DevExpress-Quelle zu kompilieren. –

+4

Dies wird in AssemblyInfo.cs enthalten sein, war zumindest für mich. Es loszuwerden löste es auch für mich. –

1

Für mich war das Problem mit der Bibliothek log4net. Ich habe die Quelle heruntergeladen und die Projektdatei in meine Lösung eingefügt, damit ich in externe Bibliotheken einsteigen kann. Log4net benötigte jedoch das Symbol NET_4_0, das für die bedingte Kompilierung definiert wurde. Standardmäßig wurde NET_1_0 definiert. Ich ging in die Eigenschaften des log4net-Projekts und änderte NET_1_0 zu NET_4_0, und das behob das Problem.

Beiseite: Vielleicht befolge ich keine Best Practices, indem ich die Bibliotheken in mein Projekt einbeziehe. Wenn dies der Fall ist, würde ich gerne Rückmeldungen zu den verschiedenen Möglichkeiten und den Vor- und Nachteilen jeder Wahl hören.Ich denke derzeit darüber nach, dass es mir im Fehlerfall möglich sein wird, die Quelle der Bibliothek zu sehen, um zu verstehen, was die Bibliothek erwartet, wodurch ich den Fehler beheben kann. Wenn man sieht, wie andere Leute Quellcode schreiben, ist das nichts, wenn nicht eine wertvolle Lernerfahrung. Im Grunde versuche ich, dem Rat von Jeff Atwood zu folgen, gefunden here. Aber wenn es einen besseren Weg gibt, dies zu erreichen, bin ich ganz Ohr.

Verwandte Themen