2009-02-04 11 views
2

Je suis currently developing an application dans lequel un utilisateur choisira dynamiquement dll et l'application exécutera certaines des méthodes de cette DLL. (si vous suivez le premier lien, vous verrez que je développe une sorte d'application de jeu Robocode en utilisant le .Net Framework). Par exemple, au début de la bataille, la méthode run de la DLL est exécutée. Etant donné que tout ce qui a été spécifié dans la méthode d'exécution sera exécuté, il y a un certain nombre de contraintes de sécurité qui doivent être appliquées. Comme par exemple, si l'utilisateur qui a programmé la dll, au lieu d'utiliser uniquement les méthodes applicables à partir de l'interface (méthodes que le robot utilise pour marcher et tirer etc ...), appelle des méthodes qui récupèreront les fichiers et peut-être même supprimer des fichiers du disque dur ... et quand un autre utilisateur chargera cette DLL dans son ordinateur, ces méthodes seront invoquées sur son pc et ses fichiers seront modifiés par ce code malveillant.Chargement des assemblys à partir d'une application .Net dans un environnement Sandbox

Ainsi, je dois faire en quelque sorte cette exécution de l'application d'une sorte de sandbox Environnement afin que toutes les méthodes sont invoquées, il n'affectera pas le disque dur de l'ordinateur que le dll est ouvert sur.

Des idées sur comment je devrais commencer à faire cela?

Voici un exemple sur la façon dont je suis le chargement de ces dll et invoquant leurs méthodes:

for (int i = 0; i < robotList.Count; i++) 
{ 
    IRunnable o = robotList[i]; 
    new Thread(delegate() 
    { 
     o.run();  
    }).Start(); 
} 

Répondre

7

Normalement, vous pourriez vivre avec

AppDomain newDomain = AppDomain.CreateDomain(name); 
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes(name)); 

Mais un point intéressant est, la méthode AppDomain.Load chargera l'ensemble sur le nouveau domaine d'application , ainsi qu'au domaine actuel.

Une solution plus élégante consiste à utiliser l'espace de noms System.AddIn dans 3.5. - http://msdn.microsoft.com/en-us/magazine/cc163476.aspx

Ensuite, vous pouvez réellement spécifier le niveau de confiance pour votre Addin, en utilisant la AddinSecurityLevel comme

//Activate the selected AddInToken in a new 
//application domain with the Internet trust level. 
Calculator CalcAddIn = selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet); 

Voir http://msdn.microsoft.com/en-us/library/bb355219.aspx pour plus de détails.

2

Qu'est-ce que vous cherchez à faire est essentiellement assemblées en cours d'exécution dans un domaine distinct application. Consultez cette page sur MSDN pour un bon point de départ. Il est en fait tout à fait à l'est de le faire:

http://msdn.microsoft.com/en-us/library/ms173139(VS.80).aspx

+0

Allez y jeter un coup d'œil; à votre santé –