Fehlermeldung „System.MethodAccessException“ bei .NET-4-Programmen beheben

Habe vorhin ein .NET-2-Programm (Windows Forms) nach .NET 4.5 geändert (also in der Projektkonfiguration in Visual Studio .NET 2012 das Ziel-Framework geändert.

Bei diesem Aufruf hat es dann gekracht:

AppDomain.CurrentDomain.UnhandledException += currentDomain_UnhandledException;

Dort kam dann eine Fehlermeldung:

System.MethodAccessException was unhandled HResult=-2146233072 Message=Fehler beim Versuch der SecurityTransparent-Methode „ZetaHelpdesk.Main.Code.AppHost.Host.Main()“, auf die sicherheitskritische Methode „System.AppDomain.add_UnhandledException(System.UnhandledExceptionEventHandler)“ zuzugreifen.

Die Assembly „zeta-helpdesk, Version=2.1.0.1, Culture=neutral, PublicKeyToken=1dbe5f735b90e083“ ist mit „AllowPartiallyTrustedCallersAttribute“ markiert und verwendet das Sicherheitstransparenzmodell der Stufe 2. Bei Festlegung der Transparenz auf Stufe 2 werden alle Methoden in AllowPartiallyTrustedCallers-Assemblys standardmäßig sicherheitstransparent, was die Ursache der Ausnahme sein kann.

Source=zeta-helpdesk

StackTrace: bei ZetaHelpdesk.Main.Code.AppHost.Host.Main() in c:\P\Zeta Helpdesk\Source\Core\Main\Code\AppHost\Host.cs:Zeile 100. bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei System.Threading.ThreadHelper.ThreadStart() InnerException:

Wer die Fehlermeldung aufmerksam liest, findet auch schon die Ursache. Da steht nämlich, dass ein Assembly-Attribut hier unpassend ist. Und tatsächlich habe ich folgendes in der Datei „AssemblyInfo.cs“ stehen:

[assembly: AllowPartiallyTrustedCallers]

Ich hatte seinerzeit aus diesem Grund das Attribut eingefügt.

Als ich das Attribut dann entfernt habe, lief alles wie gewünscht. Neu kompilieren natürlich auch noch 😉