2009-03-02 45 views
28

Hiện tại tôi có một số mã đang được tạo động. Nói cách khác, một tệp C# .cs được tạo động bởi chương trình và ý định là bao gồm tệp C# này trong một dự án khác.Tạo lắp ráp DLL động tại thời gian chạy

Thách thức là tôi muốn tạo tệp .DLL thay vì tạo tệp C# .cs để tệp có thể được tham chiếu bởi bất kỳ loại ứng dụng .NET nào (không chỉ C#) và do đó hữu ích hơn.

Trả lời

37
using System.CodeDom.Compiler; 
using System.Diagnostics; 
using Microsoft.CSharp; 

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
ICodeCompiler icc = codeProvider.CreateCompiler(); 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
parameters.GenerateExecutable = false; 
parameters.OutputAssembly = "AutoGen.dll"; 
CompilerResults results = icc.CompileAssemblyFromSource(parameters, yourCodeAsString); 

Phỏng theo http://support.microsoft.com/kb/304655

+0

Lưu ý: phiên bản cũ của mã này có thêm một hàng mã mà tạo ra một trình biên dịch từ nhà cung cấp sử dụng CSharpCodeProvider.CreateCompiler(). Điều này không được chấp nhận, bạn nên gọi trực tiếp biên dịch trực tiếp cho nhà cung cấp. –

3

Ngay bây giờ, đặt cược tốt nhất của bạn là CSharpCodeProvider; các kế hoạch cho 4.0 bao gồm "trình biên dịch như một dịch vụ", mà sẽ làm cho việc quản lý này hoàn toàn.

+0

tiêu đề của chủ đề là "tạo-dll-lắp ráp-động-at-run-time" KHÔNG "tạo-EXE-lắp ráp-động-at-run-time" mô tả liên kết của bạn abut tạo exe lúc chạy. –

+1

@AminGhaderi và ai nói gì về exe? Nếu bạn có nghĩa là "nhưng mẫu mã trên MSDN tạo ra một exe" - nó sẽ vui vẻ tạo ra dlls quá; cuối cùng, gói tệp là * không * phần thú vị của một assembly –

28

Cách phi bị phản đối để làm việc đó (sử dụng .NET 4.0 như áp phích trước đề cập):

using System.CodeDom.Compiler; 
using System.Reflection; 
using System; 
public class J 
{ 
    public static void Main() 
    {  
     System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
     parameters.GenerateExecutable = false; 
     parameters.OutputAssembly = "AutoGen.dll"; 

     CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, "public class B {public static int k=7;}"); 

     //verify generation 
     Console.WriteLine(Assembly.LoadFrom("AutoGen.dll").GetType("B").GetField("k").GetValue(null)); 
    } 
} 
+0

Nếu bạn sử dụng 'parameters.GenerateInMemory = true;' bạn có thể lấy assembly trong bộ nhớ với 'r.CompiledAssembly' –

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