2015-06-26 6 views
1

Я создаю новые .cs-файлы с CodeDom, а затем хочу скомпилировать/запустить их с помощью CSharpCodeProvider, но с некоторыми проблемами со ссылками.Можно установить абсолютный путь для ссылок в CSharpCodeProvider?

код выглядеть следующим образом:

 var provider = new CSharpCodeProvider(); 
     var compilerparams = new CompilerParameters(
      new[] 
      { 
       "First.dll", 
       "Second.dll" 
      }) 
     { 
      GenerateExecutable = false, 
      GenerateInMemory = true 
     }; 
     CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path); 
     if (!results.Errors.HasErrors) 
      return results.CompiledAssembly; 
     var errors = new StringBuilder("Compiler Errors :\r\n"); 
     foreach (CompilerError error in results.Errors) 
     { 
      errors.AppendFormat("Line {0},{1}\t: {2}\n", 
       error.Line, error.Column, error.ErrorText); 
     } 
     throw new Exception(errors.ToString()); 

«First.dll» и «Second.dll» существует в той же папке, что и мои сгенерированных .cs-файлы и если я запускаю его непосредственно я получаю сообщение об ошибке. Если я переведу их в свой каталог bin проектов, он будет работать нормально, но я предпочел бы просто разделить их.

Можно ли установить абсолютный путь для «First.dll» и «Second.dll» или путь к каталогу, который содержит все мои ссылки, вместо того, чтобы переместить их в мой каталог bin?

Я попытался сменить CompilerParameters на абсолютные пути, но это не помогло.

ответ

0

Я нашел новое решение для решения этой проблемы. Вместо генерации в памяти я устанавливаю выходной путь и возвращаю этот путь. Поэтому, когда я захочу использовать его, я загружаю его с помощью Assembly.LoadFrom() (и он будет использовать все ссылочные dll в том же каталоге).

Пример кода,

Как создать сборку:

public string CompileCode() 
    { 
     var provider = new CSharpCodeProvider(); 
     var outputPath = Path.Combine(Path.GetDirectoryName(_path), "temp.dll"); 
     var compilerparams = new CompilerParameters(
      new[] 
      { 
       @"D:\path\to\referenced\dll", 
       @"D:\path\to\referenced\dll2" 
      }, outputPath); 
     CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path); 
     var i = results.PathToAssembly; 
     if (!results.Errors.HasErrors) 
      return i; 
     var errors = new StringBuilder("Compiler Errors :\r\n"); 
     foreach (CompilerError error in results.Errors) 
     { 
      errors.AppendFormat("Line {0},{1}\t: {2}\n", 
       error.Line, error.Column, error.ErrorText); 
     } 
     throw new Exception(errors.ToString()); 
    } 

и загрузить его:

Assembly assembly = Assembly.LoadFrom(path); 
//Do stuff with assembly