2012-05-01 15 views
6

Nie jestem do końca pewien, co z tym zrobić. Ogólnym celem jest możliwość pobrania skryptu użytkownika i wykonania go w środowisku .NET. Mam większość napisanego kodu i rzeczy działają pod warunkiem, że nie próbuję załadować własnych zespołów. Jednak, aby bezpiecznie zapewnić użytkownikom dostęp do wewnętrznych części systemu, utworzono bibliotekę DLL proxy. Tutaj pojawia się problem.Ładowanie niestandardowych złożeń za pomocą CompileAssemblyFromSource

W tej chwili ta biblioteka DLL proxy ma jedną rzecz, interfejs.

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; 

Running powyższy kod, to rzuca się następujący błąd:

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.

Oczywiście moja pierwsza myśl to: "... a co scts5w5o.dll?"

Czy to nie jest ładowanie ScriptProxy.dll, czy też ScriptProxy.dll próbuje załadować zależności, które są gdzieś w pliku tymczasowym? Czy jest to coś zupełnie innego?

Powinienem wspomnieć, że wykonuję ten kod od biegacza testowego NUnit. Nie jestem pewien, czy to coś zmieni.

Odpowiedz

7

To dlatego, że krok kompilacja nie powiodła i nie sprawdzić je pod kątem błędów ...

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

To miałoby sens. Wypróbuję to teraz. –

+1

Zamierzam oznaczyć to jako odpowiedź, ponieważ chociaż nie rozwiązało problemu za każdym razem, pomogło mi uzyskać prawdziwy komunikat o błędzie, który jest prawie tak samo pomocny! –

+0

Jak rozwiązać rzeczywisty problem !! – Moumit

3

Nie sądzę słupek oznaczony jako answer jest naprawdę odpowiedź !!! ... Jednak znalazłem odpowiedź here

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

To znaczy, jeśli próbuje dodać dll odniesienia, które są stroną trzecią (kiedyś .net DLL dając też wyjątki), a następnie po prostu skopiować go w executable folder .. to będzie działać dobrze .. else możesz również zdefiniować pełną ścieżkę tam ..

Powiązane problemy