[英]A program that creates another program
我需要創建一個程序來創建另一個程序但不是編譯器。
例如,
我編寫了一個接受用戶輸入字符串的程序。 假設用戶輸入“Pluto”。 然后,該程序應該創建一個單獨的.exe,在執行時會顯示“Hello Pluto”。
我怎樣才能做到這一點? 如果您可以在C#和Windows Forms中提供示例,那就更好了。
謝謝。
基本上這是一個編譯器 - 只是為了一個特別簡單的語言。
如果你能用C#表達最終的程序,最簡單的解決方案可能是使用CSharpCodeProvider。 這就是我為Snippy所做的,這是一個幫助C#深度輕松運行代碼片段的小工具。 Snippy的源代碼位於深度網站上的C#中 ,可以讓您了解自己可以做什么 - 基本上您只是希望它將可執行文件寫入文件而不是在內存中構建。
或者,查看MSDN文檔 ,其中包含生成可執行文件的示例。
您要查找的類位於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);
(來自使用谷歌發現的微軟支持 - 不到20秒)
暫時,您還可以通過使用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。 這是非常有趣但真的很乏味的工作。
我沒有嘗試運行上面的代碼。 但是我知道它就是這樣的,因為我做了類似的事情已經有一段時間了。
使用Reflection.Emit。
http://msdn.microsoft.com/en-us/library/8ffc3x75.aspx
http://www.codeproject.com/KB/cs/DynamicCodeGeneration2.aspx
如何使用Reflection.Emit構建HelloWorld.exe(它不到半頁代碼): http : //blogs.msdn.com/b/joelpob/archive/2004/01/21/61411.aspx
最簡單的方法是創建(提前)一個非常簡短的簡單程序,該程序從自身讀取資源並打印出來。 然后您的應用程序只需要將該程序二進制文件放在磁盤上某處,並調用UpdateResource函數來更改字符串。 .NET也有資源支持,但我不知道任何與UpdateResource直接對應的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.