2010-06-11 3 views
6

Мне нужно создать программу, которая создает еще одну программу, но не компилятор.Программа, которая создает другую программу

Например,

я написать программу, которая принимает строку ввода от пользователя. Скажем, пользователь вводит «Плутон». Затем эта программа должна создать отдельный .exe, который говорит «Hello Pluto» при выполнении.

Как я могу это сделать? Если бы вы могли привести пример в C# и Windows Forms, это лучше.

Спасибо.

+5

Не могли бы вы показать нам, что вы сделали в этом задании на домашнее задание? – 48klocs

+4

Очень похож на вопрос «Код для меня» ... – Dykam

+7

Я хотел поставить «это не домашнее задание», но я думал, что вы, ребята, дадите мне возможность сомневаться. Мне уже 27 лет. Это не вопрос «code it for me». Проблема, с которой я сталкиваюсь, действительно намного больше, но я уменьшаю проблему до простого вопроса выше. – zaidwaqi

ответ

14

В основном, что является компилятором - только для особо простого языка.

Если вы можете выразить финальную программу на C#, самым простым решением, вероятно, является использование CSharpCodeProvider. Это то, что я делаю для Snippy, небольшой инструмент, помогающий легко запускать фрагменты кода для C# в Depth. Исходный код Snippy - on the C# in Depth web site и может дать вам представление о том, что вы можете сделать - в основном вы просто хотите, чтобы он записывал исполняемый файл в файл, а не создавал его в памяти.

В качестве альтернативы, посмотрите на MSDN docs, которые имеют пример, генерирующий исполняемый файл.

+0

@ Разборщики: Ухаживаете за причину? –

+0

поддерживается только ради этого. если вы посмотрите на титульную страницу, кто-то просто уменьшит все, что видит. – Femaref

+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, найденных с помощью Google - занимает менее 20 секунд)

+3

Уход, чтобы дать основание для downvote? – Femaref

+0

Люди, сбивающие правильные ответы, заставляют меня хотеть понизить их вниз. – Dykam

+0

Пожалуйста, не используйте покровительственный текст в ответе, касающемся Google. Весь смысл stackoverflow.com заключается в том, чтобы не использовать Google и иметь ссылку на кодировку здесь. Иначе почему бы нам не просто использовать Google? –

3

Ориентировочно, вы можете также achive этих Повсеместно он использует вещей в пространстве имен 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); 

Это может выглядеть немного сложной на первый, но это действительно интересный материал, и вы позволить компилятору генерировать жесткий материал, реализацию метода. Но вы не можете создавать такие поля, как это, это потребует некоторого ИЛ. Это очень весело, но очень утомительная работа.

ОТКАЗ:

Я не пытался запустить код выше. Но я знаю, что это похоже на то, что прошло какое-то время, так как я сделал что-то подобное.

0

Легче всего сделать было бы создайте (заранее) очень короткую простую программу, которая читает ресурс от себя и печатает его. Тогда вашему приложению нужно только разместить эту двоичную программу на диске где-нибудь и вызвать функцию UpdateResource, чтобы изменить строку. .NET также имеет поддержку ресурсов, но я не знаю никакой функции, которая напрямую соответствует UpdateResource.

Смежные вопросы