2010-11-30 10 views
11

Scénario: Je suis en train de refactoriser une de nos applications pour utiliser Nhibernate et j'ai rencontré ce problème il y a quelques semaines. Le problème était à l'origine avec Nhibernate et Castle et pour résoudre ce problème, ils ont tous deux été recompilés avec le [assembly: AllowPartiallyTrustedCallers]. Cependant, après avoir apporté quelques modifications à l'interface utilisateur et à la base de code, cette erreur est réapparue. Il convient également de noter que je contrôle le chargement de mes contrôles utilisateur par programme à partir de Form_Main.Cet assembly n'autorise pas les appelants partiellement approuvés. InitializeComponent()

Problème: Chaque fois que les contrôles utilisateur sont générés, l'erreur ci-dessous s'affiche. Si je commente le chargement, le programme fonctionnera. Lorsque je débogue, il se termine à la fonction InitializeComponent() qui est générée automatiquement. Notez que je ne peux pas entrer dans cette fonction.

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: 

Vous avez des idées sur le sujet? J'ai déjà ajouté [assembly: AllowPartiallyTrustedCallers] à l'assembly. Est-il possible de trouver quelle référence (?) Provoque cette erreur? Ou tout moyen de passer par InitializeComponent()?

NOTE: J'ai toutes les permissions incluses et le projet est configuré pour une confiance partielle.

De toute façon toute aide est grandement appréciée.

+0

C: \ Documents and Settings \ ID \ Desktop, est-ce un vrai chemin ou l'avez-vous édité? Les applications qui s'exécutent à partir du lecteur C: doivent toujours fonctionner en toute confiance. Recompiler seulement caché le vrai problème. –

+0

@Hans Passant, ID est mon nom d'utilisateur que j'ai supprimé. En ce moment même si je cours le programme avec les autorisations sélectionnées de ma machine locale de sorte que je ne dois pas continuer à publier sur le partage réseau pour tester à chaque fois. – Gage

+0

Je devrais deviner que "permissions sélectionnées" est votre problème. Ne pas documenter cela dans votre question est une grosse erreur. –

Répondre

7

OK, si je devais résoudre ce problème, je l'aborde comme ci-dessous:

1) Si j'utilise .NET 4.0 assurez-vous que this est déjà pris en charge.

2) Utilisez ILDASM ou le réflecteur pour ouvrir toutes les DLL en question dans le dossier bin pour vous assurer que AllowPartiallyTrustedCallersAttribute est défini sur eux.

3) Utilisez AppDomain.CurrentDomain.GetAssemblies() au moment de l'erreur (en utilisant la fenêtre immédiate) pour voir quel assemblage est chargé d'où. Je pense que cela pourrait être votre problème car j'ai vu trop souvent que des versions anciennes ou malhonnêtes des assemblys sont chargées à partir du GAC ou de divers dossiers de bacs.

Je pense qu'en utilisant ces 3 étapes, vous pourrez trouver votre problème.

+0

Lorsque j'essaie d'utiliser AppDomain.GetAssemblies(), il me donne cette erreur "Une référence d'objet est requise pour le champ, la méthode ou la propriété non-statique" System.AppDomain.GetAssemblies() "" Je l'utilise dans le " Fenêtre Immédiate ". – Gage

+0

Désolé! Utilisez AppDomain.Current.GetAssemblies() – Aliostad

+0

@Aliostad, a été en mesure de l'exécuter et il montre que 22 assemblys ont été chargés. Cela voudrait-il dire que le dernier est celui qui cause l'erreur? – Gage

7

Pour tous les futurs lecteurs qui ont peut-être manqué les commentaires sous la réponse d'Aliostad.

Fondamentalement, ce qui a fonctionné pour moi prenais conseils de Aliostad et recompiler toutes les références que je pouvais avec AllowPartiallyTrustedCallersAttribute. Pour vérifier les assemblées chargées j'ai suivi Étape 2 de Le conseil de d'Aliostad. Une fois que je m'étais assuré que toutes les DLL requises avaient cet attribut, j'ai inclus cet attribut dans mon projet et ensuite défini mon projet sur confiance totale (confiance non partielle). J'utilise Microsoft.Office.Interop.Outlook pour envoyer des emails et cela nécessite une confiance totale tout en permettant aux autres dll de fonctionner en confiance partielle.

Espérons que cela aidera les futurs utilisateurs. Toutes les questions juste commenter ci-dessous.

3

J'ai reçu cette erreur lors de l'exécution d'une DLL à partir d'un emplacement réseau. La dll était une extension pour ESRI ArcGIS utilisant des objets ArcGIS exécutés dans ArcGIS 10.1. Solution n'ouvrez pas le projet à partir de l'emplacement réseau.

Questions connexes