2012-05-01 21 views
6

No estoy muy seguro de a dónde ir con esto. El objetivo general es poder tomar una secuencia de comandos de usuario y ejecutarla en un entorno .NET. Tengo la mayor parte del código escrito y las cosas funcionan siempre que no intente cargar mis propios ensamblajes. Sin embargo, para que los usuarios accedan de manera segura a las partes internas del sistema, se ha creado una DLL proxy. Aquí es donde parece que está el problema.Cargando ensamblajes personalizados con CompileAssemblyFromSource

En este momento, esta DLL proxy tiene una cosa, una interfaz.

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; 

Ejecutar el código anterior, que arroja el siguiente error:

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.

Por supuesto, mi primer pensamiento es: "... y lo que es scts5w5o.dll?"

¿Este es el ScriptProxy.dll que no se carga correctamente, o es el propio ScriptProxy.dll el que intenta cargar las dependencias, que están en un archivo temporal en alguna parte? O es algo completamente diferente?

Debo mencionar que estoy ejecutando este código desde el corrector de prueba NUnit. No estoy seguro si eso hace la diferencia.

Respuesta

7

Esto es debido a que el paso de compilación falló y no se ha comprobar si hay errores ...

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

Eso tendría sentido. Voy a probar esto ahora mismo. –

+1

Voy a marcar esto como la respuesta porque aunque no resolvió el problema por decir, me ayudó a obtener el mensaje de error real que es casi tan útil. –

+0

Entonces, ¿cómo resuelves el problema real? – Moumit

3

No creo que el mensaje marcado como answer es realmente una respuesta !!! ... Sin embargo he encontrado la respuesta here

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

Es decir, si se trata de añadir dll de referencia que son terceros (DLL .net en algún momento también dar excepciones) entonces simplemente copiarlo en executable folder .. no tendrán ningún problema .. else también puede definir la ruta completa allí.

Cuestiones relacionadas