2010-05-01 27 views
2

Je voudrais prendre un fichier qui est un fichier IL, et au moment de l'exécution le compiler à un exe.Compilez le code IL à l'exécution en utilisant .NET 3.5 et C# à partir du fichier

Actuellement, je peux utiliser process.start pour déclencher la ligne de commande avec des paramètres (ilasm.exe) mais je voudrais automatiser ce processus à partir d'un service C# que je vais créer.

Existe-t-il un moyen de le faire avec réflexion et réflexion?

Bien que cela fonctionne:

string rawText = File.ReadAllText(string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName")), Encoding.ASCII); 

rawText = rawText.Replace("[--STRIP--]", guid); 

File.Delete(string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName"))); 

File.WriteAllText(string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName")),rawText, Encoding.ASCII); 

pi = new ProcessStartInfo(); 
pi.WindowStyle = ProcessWindowStyle.Hidden; 
pi.FileName = "\"" + ilasm + "\""; 
pi.Arguments = string.Format("c:\\temp\\{0}.il", Utility.GetAppSetting("baseName")); 

using(Process p = Process.Start(pi)) 
{ 
    p.WaitForExit(); 
} 

Il est pas idéal car je voudrais vraiment que ce soit un processus simplifié.

J'ai vu des exemples de création d'IL à l'exécution, puis de sauvegarde, mais j'ai besoin d'utiliser l'IL que j'ai déjà sous forme de fichier et de le recompiler en exe.

Merci.

+0

Vous pouvez utiliser les méthodes Reflection.Emit ou dynamiques selon l'origine de votre IL. Est-ce généré? –

+0

L'IL d'origine sera généré à partir de Ildasm.exe. – nitefrog

Répondre

4

Qu'entendez-vous par «processus simplifié»? Ne fonctionne-t-il pas assez bien pour vous? Je sais que c'est un peu sale d'engendrer un processus séparé, mais c'est la façon la plus simple de penser. Avec les autorisations appropriées, vous devriez toujours être en mesure de le faire à partir d'un service.

Vous voulez quelque chose comme CSharpCodeProvider mais pour IL; Je ne connais pas un tel cours, j'en ai peur.

+0

Bonjour Jon, Merci pour la réponse. Il se sent juste comme vous dites "maladroit". Mais si c'est la seule façon de le faire, alors je suppose que je suis coincé en appelant la ligne de commande. Un autre problème est que cela va être un service, et pourrait devenir un peu lourd avec l'utilisation à certains moments. Je ne suis pas sûr de savoir comment appeler une ligne de commande util va préformer. J'aime juste avoir une application plus polie. Merci. – nitefrog

+0

@nitefrog: Je comprends la préférence pour une bibliothèque sur la génération d'un processus - mais si cela fonctionne, je m'en tiens à cela pour le moment. Vous devriez probablement calculer votre charge et faire un test de charge assez tôt pour voir si vous serez capable de le gérer. –

+0

Cecil est une bibliothèque de manipulation d'assemblage. Il lit et écrit des assemblys, pas des fichiers IL. –

1

En fait, de nombreux obfuscators, tels que preemtive et BitHelmet utilisent ilasm.exe et Process. Je pense que c'est la meilleure stratégie.