2012-05-01 2 views
6

Je ne sais pas trop où aller avec cela. L'objectif global est de pouvoir prendre un script utilisateur et de l'exécuter dans un environnement .NET. J'ai la plupart du code écrit et les choses fonctionnent à condition que je n'essaie pas de charger mes propres assemblys. Toutefois, pour permettre aux utilisateurs d'accéder en toute sécurité aux parties internes du système, une DLL proxy a été créée. C'est là que le problème semble être.Chargement des assemblages personnalisés avec CompileAssemblyFromSource

Maintenant, cette DLL proxy a une chose, une interface.

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; 

Exécution du code ci-dessus, il jette l'erreur suivante:

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.

Bien sûr, ma première pensée est, "... et ce qui est scts5w5o.dll?"

Est-ce que le ScriptProxy.dll ne se charge pas correctement, ou est le ScriptProxy.dll lui-même essayant de charger des dépendances, qui sont dans un fichier temporaire quelque part? Ou est-ce quelque chose de complètement différent?

Je devrais mentionner, j'exécute ce code du coureur de test de NUnit. Je ne suis pas sûr que cela fasse une différence.

Répondre

7

En effet, l'étape de compilation a échoué et vous n'avez pas vérifier les erreurs ...

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

Cela aurait du sens. Je vais essayer ça maintenant. –

+1

Je vais marquer cela comme la réponse parce que même si cela n'a pas résolu le problème, cela m'a aidé à obtenir le vrai message d'erreur qui est presque aussi utile! –

+0

Alors, comment résolvez-vous le problème réel !! – Moumit

3

Je ne pense pas que le poste marqué comme answer est vraiment une réponse !!! ... Cependant, je trouve la réponse here

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

cela signifie si vous essayez d'ajouter dll de référence sont des tiers (dll parfois .net donnant également des exceptions) puis copiez simplement dans executable folder .. cela fonctionnera très bien .. Sinon, vous pouvez également définir le chemin complet là ..

Questions connexes