2009-12-07 13 views
0

J'ai un COM (écrit en .NET) qui doit créer un AppDomain et charger/exécuter des assemblys .NET dedans. Alors que je pourrais décharger ce appDomain plus tard avec toutes les DLL chargées. Tout en fonctionnant correctement dans une application .NET normale (par exemple WinForms), j'obtiens des exceptions de sécurité si ce code s'exécute dans le contexte COM. En supposant que l'assembly COM est fortement nommé et placé dans GAC, il dispose d'une stratégie de sécurité totale. Quelqu'un peut-il expliquer si c'est possible, et si non - pourquoi?Un assemblage peut-il être exécuté ou chargé dans un composant COM C# .NET?

+0

De quel type d'exception de sécurité disposez-vous? J'ai une application .NET COM LocalServer qui fonctionne bien (je n'utilise pas le GAC cependant). –

+0

La demande d'autorisation de type 'System.Security.Permissions.SecurityPermission, mscorlib, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089' a échoué. quand j'essaye AppDomain.executeAssembly(). Et j'obtiens FileIOPermission (ou smth similaire) Exception quand j'essaye de charger un. – Revenge

+0

également je suis passé à GAC pour le composant COM parce que lors de la création de l'objet par exemple. à partir du code C++, j'ai obtenu l'exception FileNotFound. Lorsque j'ai placé COM assembly dans GAC, cela a fonctionné correctement. Puis j'ai eu ces exceptions de sécurité, donc j'ai signé les assemblées que j'ai utilisées et j'ai essayé de les mettre dans GAC - ça n'a pas fonctionné. – Revenge

Répondre

0

Oui, c'est possible. Pour que CAS vous laisse faire cela, vous devez inclure l'attribut

[assembly: System.Security.AllowPartiallyTrustedCallersAttribute()] 

dans l'ensemble COM et les assemblys chargés. également la création d'objets et l'exécution d'ensembles, il faudrait ajouter un ensemble approprié d'autorisation au nouveau domaine d'application comme ceci:

AppDomainSetup setup = new AppDomainSetup(); 
setup.ApplicationBase = Path.GetDirectoryName(path); 
PermissionSet trustPermissionSet = new PermissionSet(PermissionState.Unrestricted); 
AppDomain newDomain = AppDomain.CreateDomain("descriptive name", null, setup, trustPermissionSet); 

Ensuite, vous pouvez simplement créer un objet via CreateInstanceFromAndUnwrap() ou executeAssembly. Il aussi est une solution à ce problème - à utiliser Activator:

System.Runtime.Remoting.ObjectHandle objHandle = Activator.CreateInstanceFrom(_pluginStore[path], path, pluginClass); 

if (objHandle != null) 
{ 
    object unwrappedInstance = objHandle.Unwrap(); 
    result.Add(unwrappedInstance); 
} 

mais après son code d'exécution n'a pas le droit de faire une « choses compliquées ».

Vous pouvez en savoir plus here.