2009-08-28 9 views
3

Comment puis-je exécuter un programme dans un MemoryStream afin de ne pas devoir l'enregistrer d'abord sur le disque dur. Le fichier peut ne pas être enregistré sur le disque dur. Le programme doit être 100% fonctionnel de la mémoire.Exécuter un programme à partir de MemoryStream

 static string strTemplate = "MyAPP.SOMEprogram.exe"; 
     byte[] template; 
     int len = 0; 

     Assembly assembly = Assembly.GetExecutingAssembly(); 
     using (Stream stream = assembly.GetManifestResourceStream(strTemplate)) 
     { 

      len = (int)stream.Length; 
      BinaryReader reader = new BinaryReader(stream); 
      template = reader.ReadBytes(len); 


     } 

     MemoryStream ms = new MemoryStream(template, true); 

Maintenant, tout programme de travail 100% MemoryStream (sur RAM), puis-je exécuter ce programme? Merci beaucoup

+1

Je suppose que vous ne parlez pas de charger un assemblage géré, n'est-ce pas? –

Répondre

2

Je ne peux pas penser à une façon évidente de faire cela. Le plus proche que je peux penser est d'utiliser un disque RAM - vous n'aurez pas accès au disque dur (en plus de paginer peut-être) mais cela reste très différent de ce que vous demandez. Juste pour noter, je parle de l'exécution de programmes arbitraires, et non du chargement d'assemblages gérés.

+0

ok, vous commentez le plus utile, comment puis-je faire un disque RAM dans C#? –

+1

Vous devrez installer un pilote, appeler l'API driver pour créer un nouveau disque RAM et l'utiliser comme n'importe quel lecteur ordinaire - écrivez votre programme dans un fichier sur le disque RAM et exécutez-le. http://www.mydigitallife.info/2007/05/27/free-ramdisk-for-windows-vista-xp-2000-and-2003-server/ liste plusieurs pilotes de disque RAM, certains viennent avec la source, mais comment installer exactement un pilote et interagir avec lui dépendra probablement fortement du pilote que vous choisissez. Vous devriez commencer à lire la documentation et la source (si disponible), puis voir comment continuer. –

+0

merci, mais tout le problème est que je ne veux pas voir l'utilisateur frm où le programme exécuté, je veux une protection contre la copie, disque ram ici peut aider? –

1

Vous pouvez essayer Assembly.Load(byte[]), mais vous devrez peut-être contourner les autorisations d'accès au code, et certains antivirus ne vous permettront peut-être pas de le faire également.

+0

oui vous avez raison Assembly.Load (byte []), mais cela ne fonctionne que si dans ce tableau byte [] contient le programme .net, sinon ne fonctionne pas, est-ce que j'ai raison? –

+2

Oui, vous avez raison. Veuillez mettre à jour votre question pour le mentionner si vous souhaitez exécuter des applications natives intégrées en tant que ressources dans une application .net. –

1

La clé ici est de construire/charger un assemblage en mémoire à partir du tableau d'octets see. Une fois que vous avez une référence à l'assembly, vous pouvez facilement accéder à ses types et les instancier. Une fois que vous avez des instances de type, appelez une méthode pour "exécuter" votre programme.

+0

Assembly .. ::. Load, méthode (tableau []) est-ce que cela fonctionne pour les programmes qui ont écrit en C++ et pas en C# ?? merci –

+0

Non fonctionne aussi en C#. –

+0

pour C++ fonctionne ??? –

Questions connexes