2010-11-30 13 views
11

Szenario: Ich bin gerade dabei, eine unserer Anwendungen für die Verwendung von Nhibernate zu refaktorisieren und kam vor ein paar Wochen auf dieses Problem. Das Problem war ursprünglich mit Nhibernate und Castle und um dies zu lösen, wurden beide mit der [assembly: AllowPartiallyTrustedCallers] neu kompiliert. Nachdem jedoch einige Änderungen an der Benutzeroberfläche und der Codebasis vorgenommen wurden, ist dieser Fehler erneut aufgetreten. Auch erwähnenswert ist, dass ich das Laden meiner Benutzer steuert programmgesteuert von Form_Main steuert.Diese Assembly lässt teilweise vertrauenswürdige Anrufer nicht zu. InitializeComponent()

Problem: Immer wenn die Benutzersteuerelemente generiert werden, erhalte ich den Fehler unten. Wenn ich das Laden auskommentiere, wird das Programm ausgeführt. Wenn ich es debugge, endet es bei der Funktion InitializeComponent(), die automatisch generiert wird. Beachten Sie, dass ich diese Funktion nicht ausführen kann.

System.Security.SecurityException was unhandled 
     Message="That assembly does not allow partially trusted callers." 
     Source="A" 
     GrantedSet="" 
     PermissionState="" 
     RefusedSet="" 
     Url="file:///C:/Documents and Settings/ID/Desktop/A-NHIB2/bin/Debug/A.EXE" 
     StackTrace: 
      at A.UserControlCyber.InitializeComponent() 
      at A.UserControlCyber..ctor() in C:\Documents and Settings\ID\Desktop\A-NHIB2\UserControl_Cyber.cs:line 34 
      at A.FormMain.FormMainLoad(Object sender, EventArgs e) in C:\Documents and Settings\ID\Desktop\A-NHIB2\Form_Main.cs:line 30 
      at System.Windows.Forms.Form.OnLoad(EventArgs e) 
      at System.Windows.Forms.Form.OnCreateControl() 
      at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
      at System.Windows.Forms.Control.CreateControl() 
      at System.Windows.Forms.Control.WmShowWindow(Message& m) 
      at System.Windows.Forms.Control.WndProc(Message& m) 
      at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
      at System.Windows.Forms.ContainerControl.WndProc(Message& m) 
      at System.Windows.Forms.Form.WmShowWindow(Message& m) 
      at System.Windows.Forms.Form.WndProc(Message& m) 
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
      at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
      at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow) 
      at System.Windows.Forms.Control.SetVisibleCore(Boolean value) 
      at System.Windows.Forms.Form.SetVisibleCore(Boolean value) 
      at System.Windows.Forms.Control.set_Visible(Boolean value) 
      at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
      at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
      at System.Windows.Forms.Application.Run(Form mainForm) 
      at A.Program.Main() in C:\Documents and Settings\ID\Desktop\A-NHIB2\Program.cs:line 32 
      at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
      at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) 
      at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) 
      at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() 
      at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 
      at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) 
      at System.Activator.CreateInstance(ActivationContext activationContext) 
      at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 
      at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
      at System.Threading.ExecutionContext.runTryCode(Object userData) 
      at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
      at System.Threading.ThreadHelper.ThreadStart() 
     InnerException: 

Wer hat irgendwelche Ideen zu diesem Thema? Ich habe bereits [Assembly: AllowPartiallyTrustedCallers] zur Assembly hinzugefügt. Gibt es eine Möglichkeit herauszufinden, welche Referenz (?) Diesen Fehler verursacht? Oder irgendeine Möglichkeit, durch InitializeComponent() zu gehen?

HINWEIS: Ich habe alle Berechtigungen enthalten und das Projekt ist teilweise Vertrauen gesetzt.

Anyways jede Hilfe wird sehr geschätzt.

+0

C: \ Dokumente und Einstellungen \ ID \ Desktop, ist das ein echter Pfad oder hast du ihn bearbeitet? Apps, die vom Laufwerk C: ausgeführt werden, sollten immer mit voller Vertrauenswürdigkeit ausgeführt werden. Neukompilierung versteckte nur das eigentliche Problem. –

+0

@Hans Passant, ID ist mein Benutzername, den ich entfernt habe. Gerade jetzt, ich führe das Programm mit den ausgewählten Berechtigungen von meinem lokalen Computer aus, so dass ich nicht jedes Mal auf die Netzwerkfreigabe veröffentlichen muss, um es zu testen. – Gage

+0

Ich würde vermuten, dass "ausgewählte Berechtigungen" Ihr Problem ist. Dies in Ihrer Frage nicht zu dokumentieren, ist ein großer Fehler. –

Antwort

7

OK, wenn ich dieses Problem zu beheben wäre, würde ich es wie unten nähern:

1) Wenn ich this .NET 4.0 stellen Sie sicher, bin mit bereits behandelt.

2) Verwenden Sie ILDASM oder Reflektor, um alle fraglichen DLLs im bin-Ordner zu öffnen, um sicherzustellen, dass AllowPartiallyTrustedCallersAttribute auf ihnen gesetzt ist.

3) Verwenden Sie AppDomain.CurrentDomain.GetAssemblies() zum Zeitpunkt des Fehlers (mit sofortigem Fenster), um zu sehen, welche Baugruppe von wo geladen wird. Dies könnte Ihr Problem sein, wie ich zu oft gesehen habe, dass alte oder Rogue-Versionen von Assemblys aus GAC oder verschiedenen bin Ordnern

geladen werden. Ich denke, mit diesen 3 Schritten werden Sie in der Lage sein, Ihr Problem zu finden.

+0

Wenn ich versuche, AppDomain.GetAssemblies() zu verwenden, gibt es mir die Fehlermeldung "Eine Objektreferenz ist für das nicht statische Feld, die Methode oder die Eigenschaft erforderlich" System.AppDomain.GetAssemblies() '"Ich verwende es in der" Direktes Fenster ". – Gage

+0

Entschuldigung! Verwenden Sie AppDomain.Current.GetAssemblies() – Aliostad

+0

@Aliostad, konnte es ausführen, und es zeigt, dass 22 Assemblys geladen wurden. Würde das bedeuten, dass der letzte den Fehler verursacht? – Gage

7

Für alle zukünftigen Leser wer kann die Kommentare unter Aliostad Antwort verpasst haben. Grundsätzlich

was für mich gearbeitet Aliostad der Rat nahm und neu zu kompilieren alle Verweise ich konnte mit AllowPartiallyTrustedCallersAttribute. Um zu überprüfen, die Baugruppen, die ich geladen habe, folgte Schritt 2 von Aliostad Beratung. Sobald ich sichergestellt hatte, dass alle erforderlichen DLLs dieses Attribut hatten, habe ich dieses Attribut in mein Projekt eingefügt und dann mein Projekt auf Full Trust gesetzt (nicht teilweise Vertrauen).

Hinweis: Ich benutze Microsoft.Office.Interop.Outlook, um E-Mails zu senden, und es erfordert volle Vertrauenswürdigkeit, aber immer noch ermöglicht die anderen DLLs in teilweise vertrauen.

Ich hoffe, dies hilft zukünftigen Benutzern. Alle Fragen kommentieren Sie unten.

3

Ich habe diesen Fehler beim Ausführen einer DLL von einem Netzwerkstandort. Die DLL war eine Erweiterung für ESRI ArcGIS mit Arcobjekten, die in ArcGIS 10.1 ausgeführt werden. Lösung Projekt nicht vom Netzwerkstandort aus öffnen.