簡體   English   中英

一個創建另一個程序的程序

[英]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。 這是非常有趣但真的很乏味的工作。

免責聲明:

我沒有嘗試運行上面的代碼。 但是我知道它就是這樣的,因為我做了類似的事情已經有一段時間了。

最簡單的方法是創建(提前)一​​個非常簡短的簡單程序,該程序從自身讀取資源並打印出來。 然后您的應用程序只需要將該程序二進制文件放在磁盤上某處,並調用UpdateResource函數來更改字符串。 .NET也有資源支持,但我不知道任何與UpdateResource直接對應的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM