2012-05-01 33 views
6

Tôi không chắc chắn nên đi đâu với điều này. Mục tiêu tổng thể là có thể lấy một kịch bản người dùng và thực hiện nó trong môi trường .NET. Tôi có hầu hết các mã được viết và những thứ làm việc được cung cấp tôi không cố gắng để tải hội đồng của riêng tôi. Tuy nhiên, để cung cấp cho người dùng quyền truy cập vào các phần bên trong của hệ thống một cách an toàn, một proxy proxy đã được tạo. Đây là nơi mà vấn đề dường như là.Đang tải các hội đồng tùy chỉnh với CompileAssemblyFromSource

Ngay bây giờ, proxy proxy này có một thứ trong đó, một giao diện.

CompilerParameters options = new CompilerParameters(); 
options.GenerateExecutable = false; 
options.GenerateInMemory = true; 
options.ReferencedAssemblies.Add("System.dll"); 
options.ReferencedAssemblies.Add("ScriptProxy.dll"); 

Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); 
CompilerResults result = provider.CompileAssemblyFromSource(options, script); 

// This line here throws the error: 
return result.CompiledAssembly; 

Chạy đoạn mã trên, nó ném các lỗi sau:

System.IO.FileNotFoundException : Could not load file or assembly 'file:///C:\Users...\AppData\Local\Temp\scts5w5o.dll' or one of its dependencies. The system cannot find the file specified.

Tất nhiên suy nghĩ đầu tiên của tôi là, "... và scts5w5o.dll là gì?"

Đây có phải là ScriptProxy.dll không tải đúng cách hay chính ScriptProxy.dll đang cố tải phụ thuộc vào tệp tạm thời ở đâu đó? Hay nó là một cái gì đó hoàn toàn khác?

Tôi nên đề cập đến, tôi đang thực thi mã này từ trình kiểm tra NUnit. Tôi không chắc liệu điều đó có tạo nên sự khác biệt hay không.

Trả lời

7

Điều này là do các bước biên dịch thất bại và bạn đã không kiểm tra nó có lỗi gì ...

static Assembly Compile(string script) 
    { 
     CompilerParameters options = new CompilerParameters(); 
     options.GenerateExecutable = false; 
     options.GenerateInMemory = true; 
     options.ReferencedAssemblies.Add("System.dll"); 
     options.ReferencedAssemblies.Add("ScriptProxy.dll"); 

     Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); 
     CompilerResults result = provider.CompileAssemblyFromSource(options, script); 

     // Check the compiler results for errors 
     StringWriter sw = new StringWriter(); 
     foreach (CompilerError ce in result.Errors) 
     { 
      if (ce.IsWarning) continue; 
      sw.WriteLine("{0}({1},{2}: error {3}: {4}", ce.FileName, ce.Line, ce.Column, ce.ErrorNumber, ce.ErrorText); 
     } 
     // If there were errors, raise an exception... 
     string errorText = sw.ToString(); 
     if (errorText.Length > 0) 
      throw new ApplicationException(errorText); 

     return result.CompiledAssembly; 
    } 
+0

Điều đó có ý nghĩa. Tôi sẽ thử điều này ngay bây giờ. –

+1

Tôi sẽ đánh dấu điều này là câu trả lời vì mặc dù nó không giải quyết được vấn đề theo lời nói, nó đã giúp tôi nhận được thông báo lỗi thực sự gần như là hữu ích! –

+0

Vì vậy, làm thế nào để bạn giải quyết vấn đề thực tế !! – Moumit

3

Tôi không nghĩ rằng các bài đánh dấu là answer thực sự là một câu trả lời !!! ... Tuy nhiên tôi tìm thấy câu trả lời here

parameters.ReferencedAssemblies.Add(typeof(<TYPE FROM DOMAIN.DLL>).Assembly.Location); 

Nó có nghĩa là nếu bạn cố gắng để thêm dll tài liệu tham khảo mà bên thứ ba (dlls đôi khi .net cũng đưa ra trường hợp ngoại lệ) sau đó chỉ cần sao chép nó trong executable folder .. nó sẽ làm việc tốt .. khác bạn cũng có thể xác định đường dẫn đầy đủ ở đó ..

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