2010-06-11 226 views
6

我需要創建一個程序來創建另一個程序,但不是編譯器。創建另一個程序的程序

例如,

我編寫了一個程序,該程序接受來自用戶的字符串輸入。假設用戶輸入「Pluto」。這個程序應該在執行時創建一個單獨的.exe文件,上面寫着「Hello Pluto」。

我該怎麼做?如果你可以在C#和Windows窗體中給出例子,那就更好了。

謝謝。

+5

你能告訴我們你到目前爲止完成了這項家庭作業嗎? – 48klocs 2010-06-11 21:00:11

+4

看起來很像一個代碼爲我的問題... – Dykam 2010-06-11 21:01:48

+7

我想把「這不是家庭作業」,但我想你們會給我的懷疑的好處。我已經27歲了。這不是「爲我編碼」的問題。我面對的問題真的很大,但我將問題簡化爲上面的簡單問題。 – zaidwaqi 2010-06-11 21:03:41

回答

14

基本上,一個編譯器 - 只是一個特別簡單的語言。

如果你可以在C#中表達最終的程序,最簡單的解決方案可能是使用CSharpCodeProvider。這就是我爲Snippy所做的,這是一個幫助C#深度運行代碼片段的小工具。 Snippy的源代碼是on the C# in Depth web site,可以讓你知道你可能會做什麼 - 基本上你只是希望它將可執行文件寫入文件而不是將其構建在內存中。

或者,查看MSDN docs,它們有一個生成可執行文件的示例。

+0

@Downvoters:小心給個理由? – 2010-06-11 21:02:57

+0

upvoted只是爲了它。如果你仔細查看頭版,有人只是低估了他所看到的一切。 – Femaref 2010-06-11 21:04:26

+2

降低了一切。看看問題列表。許多優秀的問題都被低估了。請停止那個機器人! – 2010-06-11 21:07:14

11

你正在尋找的類是在Microsoft.CSharp命名空間

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = true; 
parameters.OutputAssembly = Output; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters,SourceString); 

(通過使用谷歌發現microsoft support - 只需要不到20秒)

+3

謹慎給出downvote的原因? – Femaref 2010-06-11 21:03:31

+0

人們低估正確的答案讓我想downvote那些downvoters。 – Dykam 2010-06-11 21:06:38

+0

請不要在有關谷歌的答案中使用光顧文本。整個stackoverflow.com的重點是不使用谷歌,並在這裏有一個編碼參考。否則,爲什麼我們不都只是使用谷歌? – 2010-09-19 12:12:22

3

試探性,還可以實現這一目標throught他用System.Reflection.Emit命名空間中的東西,我相信可以通過使用LINQ表達式樹來提供方法的實現。這是一種利落:

var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("TestAssembly"), AssemblyBuilderAccess.RunAndSave); 
var mod = assembly.DefineDynamicModule("TestModule"); 
var type = mod.DefineType("TestType"); 
var method = type.DefineMethod("Increment", MethodAttributes.Public, typeof(int), Type.EmptyTypes); 
Expression<Func<int, int>> inc = (a) => a + 1; // this is cool 
inc.CompileToMethod(method); 

它看起來起初有點令人生畏,但它確實很酷的東西,你讓編譯器產生硬的東西,該方法的具體實現。但是你不能真的創造這樣的領域,這將需要一些IL。這是非常有趣,但真正枯燥的工作。

免責聲明:

我還沒有試過運行上面的代碼。但我知道事情就是這樣,自從我做了那樣的事情之後,我已經有一段時間了。

0

做將是最簡單的事情(預先)創建一個非常簡短的程序,從自己讀取資源並打印它。然後,您的應用程序只需將該程序二進制文件放置在某個磁盤上,然後調用UpdateResource函數更改該字符串。 .NET也有資源支持,但我不知道任何直接對應於UpdateResource的函數。