2010-06-11 46 views
6

Tôi cần tạo chương trình tạo chương trình khác nhưng không phải là trình biên dịch.Chương trình tạo chương trình khác

Ví dụ:

Tôi viết chương trình chấp nhận đầu vào chuỗi từ người dùng. Giả sử người dùng nhập "Pluto". Chương trình này sau đó sẽ tạo một .exe riêng biệt có nội dung "Hello Pluto" khi được thực hiện.

Tôi làm cách nào để thực hiện việc này? Nếu bạn có thể đưa ra ví dụ trong C# và Windows Forms, thì tốt hơn.

Cảm ơn.

+5

Bạn có thể cho chúng tôi biết bạn đã làm gì trong bài tập về nhà này cho đến nay không? – 48klocs

+4

Trông rất giống với câu hỏi mã-nó-cho-tôi ... – Dykam

+7

Tôi muốn đặt "đây không phải là bài tập về nhà", nhưng tôi nghĩ các bạn sẽ cho tôi lợi ích của sự nghi ngờ. Tôi đã 27 tuổi rồi. Nó không phải là "mã nó cho tôi" câu hỏi. Vấn đề tôi đối mặt thực sự lớn hơn nhiều, nhưng tôi giảm vấn đề xuống câu hỏi đơn giản ở trên. – zaidwaqi

Trả lời

14

Về cơ bản, trình biên dịch - chỉ dành cho một ngôn ngữ đặc biệt đơn giản.

Nếu bạn có thể diễn tả chương trình cuối cùng trong C#, giải pháp dễ nhất có lẽ là sử dụng CSharpCodeProvider. Đó là những gì tôi làm cho Snippy, một công cụ nhỏ để giúp chạy đoạn mã dễ dàng cho C# trong chiều sâu. Mã nguồn cho Snippy là on the C# in Depth web site và có thể cung cấp cho bạn ý tưởng về những gì bạn có thể làm - về cơ bản bạn chỉ muốn nó viết tệp thi hành vào tệp thay vì xây dựng nó trong bộ nhớ.

Hoặc, hãy xem MSDN docs có ví dụ tạo tệp thực thi.

+0

@Downvoters: Chăm sóc để đưa ra lý do? –

+0

được thăng hạng chỉ vì lợi ích của nó. nếu bạn nhìn qua trang đầu, ai đó chỉ là downvoting mọi thứ anh ta thấy. – Femaref

+2

điều gì đó làm giảm mọi thứ. Nhìn vào danh sách câu hỏi. Nhiều câu hỏi hay được downvoted. Vui lòng dừng bot đó! –

11

Các lớp bạn đang tìm kiếm là trong không gian tên 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); 

(từ microsoft support tìm thấy bằng cách sử dụng google - dùng ít hơn 20 giây)

+3

chăm sóc để đưa ra một lý do cho downvote? – Femaref

+0

Mọi người downvoting câu trả lời thích hợp làm cho tôi muốn downvote những downvoters. – Dykam

+0

Vui lòng không sử dụng văn bản bảo trợ trong câu trả lời liên quan đến google. Toàn bộ điểm stackoverflow.com là không sử dụng google và có một tham chiếu mã hóa ở đây. Nếu không, tại sao chúng ta không chỉ sử dụng google? –

3

Dự kiến, bạn cũng có thể đạt được qua hệ này, ông sử dụng của những thứ trong không gian tên System.Reflection.Emit và tôi tin rằng nó có thể cung cấp việc thực hiện một phương thức thông qua việc sử dụng các cây biểu thức LINQ. Đó là loại gọn gàng:

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); 

Nó có thể hơi khó khăn lúc đầu, nhưng nó thực sự tuyệt vời, và bạn để trình biên dịch tạo ra nội dung khó, triển khai phương pháp. Nhưng bạn không thể thực sự tạo ra các lĩnh vực như thế này, đó sẽ đòi hỏi một số IL. Đó là niềm vui tuyệt vời nhưng thực sự làm việc tẻ nhạt.

KHUYẾN CÁO:

Tôi chưa thử chạy mã trên. Nhưng tôi biết nó giống như vậy, đã lâu rồi tôi mới làm như thế.

0

Điều dễ nhất để làm sẽ được tạo (trước) một chương trình đơn giản ngắn thực sự đọc một tài nguyên từ chính nó và in nó. Sau đó, ứng dụng của bạn chỉ cần đặt chương trình đó trên đĩa nhị phân ở đâu đó và gọi hàm UpdateResource để thay đổi chuỗi. .NET cũng có hỗ trợ tài nguyên, nhưng tôi không biết bất kỳ hàm nào tương ứng trực tiếp với UpdateResource.

Các vấn đề liên quan