CodeDOM — Ошибка компиляции

Я компилирую код с помощью CodeDOM. Сначала все отлично компилировалось, но теперь у меня проблема с кодовой строкой 16:

 1        public void GenerateAssembly (bool inMemory, string assemblyName) {
 2               CompilerParameters cp = new CompilerParameters();
 3               cp.GenerateExecutable = false;
 4               cp.GenerateInMemory = inMemory;
 5               cp.OutputAssembly = assemblyName;
 6               cp.ReferencedAssemblies.Add("mscorlib.dll");
 7               cp.ReferencedAssemblies.Add("System.dll");
 8               cp.ReferencedAssemblies.Add("System.Core.dll");
 9               cp.ReferencedAssemblies.Add("System.Data.Linq.dll");
10               cp.ReferencedAssemblies.Add("System.Data.Entity.dll");
11               var providerOptions = new Dictionary<string, string>();
12               providerOptions.Add("CompilerVersion", "v4.0");
13               CodeDomProvider compiler = CodeDomProvider.CreateProvider("C#", providerOptions);
14               compiler.CompileAssemblyFromSource(compilationParameters, sourceCode)
15               buildErrors = compilationResult.Errors;
16               lastBuild = compilationResult.CompiledAssembly;
17       }

Ошибка, которую я получаю:

FileNotFoundException
Could not load file or assembly 'file:///[project_location]\bin\Debug\Dynamic.dll'
or one of its dependencies. The system cannot find the file specified.

РЕДАКТИРОВАТЬ 1 Что такое исходный код?

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

 1 public class CustomCompile {
 2        private string[] sourceCode;
 3        public string[] SourceCode { get { return sourceCode; } }
 4        public CompilerErrorCompilation buildErrors;
 5        public Assembly lastBuild;
 6        public CustomCompile (string[] sourceCode) {
 7               this.sourceCode = sourceCode;
 8        }
 9        public void GenerateAssembly (bool inMemory, string assemblyName) {
10               CompilerParameters cp = new CompilerParameters();
11               cp.GenerateExecutable = false;
12               cp.GenerateInMemory = inMemory;
13               cp.OutputAssembly = assemblyName;
14               cp.ReferencedAssemblies.Add("mscorlib.dll");
15               cp.ReferencedAssemblies.Add("System.dll");
16               cp.ReferencedAssemblies.Add("System.Core.dll");
17               cp.ReferencedAssemblies.Add("System.Data.Linq.dll");
18               cp.ReferencedAssemblies.Add("System.Data.Entity.dll");
19               var providerOptions = new Dictionary<string, string>();
20               providerOptions.Add("CompilerVersion", "v4.0");
21               CodeDomProvider compiler = CodeDomProvider.CreateProvider("C#", providerOptions);
22               compiler.CompileAssemblyFromSource(compilationParameters, sourceCode)
23               buildErrors = compilationResult.Errors;
24               lastBuild = compilationResult.CompiledAssembly;
25       }
26 }

РЕДАКТИРОВАТЬ 2 Пример

   var scriptA = "using System;\nusing System.Collection;\nclass Test {\n\tvoid Init () { Console.WriteLine (\"Void Init got called\"); }\n}";
   var compile = new CustomCompile(new string[] {});
   compile.GenerateAssembly (false, "Dynamic.dll");
   // -- or --
   compile.GenerateAssembly (true, "Dynamic.dll");

2nd ex

   var compile = new CustomCompile(new string[] {System.IO.File.ReadAllText ("C:\\Users\\[Username]\\Desktop\\CommandExecuter - Copy.cs")});
   compile.GenerateAssembly (false, "Dynamic.dll");
   // -- or --
   compile.GenerateAssembly (true, "Dynamic.dll");

http://pastebin.com/PGWbKFdD


person Mark Smethwick    schedule 05.05.2015    source источник
comment
Что находится в sourceCode?   -  person Ron Beyer    schedule 05.05.2015
comment
string[] sourceCode, содержит все коды, которые мне нужно скомпилировать внутри сборки   -  person Mark Smethwick    schedule 05.05.2015
comment
Я понимаю это, но что это фактически содержит, например, приведите нам пример.   -  person Ron Beyer    schedule 05.05.2015
comment
@RonBeyer добавил 2 примера, оба реально используются в работе   -  person Mark Smethwick    schedule 05.05.2015
comment
Содержат ли ошибки сборки что-нибудь, когда вы получаете эту ошибку?   -  person Ron Beyer    schedule 05.05.2015
comment
Не пытайтесь получить доступ к CompiledAssembly при наличии ошибок сборки, он не будет существовать.   -  person Hans Passant    schedule 05.05.2015
comment
да, у меня 2 ошибки, я думаю, причина в этом, я забыл упомянуть, что есть скрипт, который ссылается на сборку перед компиляцией. он добавлял использование ; но нет имени пространства имен. посмотрим, исправит ли это ошибку   -  person Mark Smethwick    schedule 05.05.2015
comment
@RonBeyer отличные ребята, отлично, нашли проблему.   -  person Mark Smethwick    schedule 05.05.2015
comment
@HansPassant, я удалял dll, теперь я сначала проверю на наличие ошибок, а затем, если все в порядке, получите dll   -  person Mark Smethwick    schedule 05.05.2015


Ответы (1)


Если исходные коды, которые мы компилируем, имеют какую-либо ошибку, CodeDOM удаляет dll после компиляции или никогда не создает ее. В каждом случае значение CompiledAssembly равно null, поэтому убедитесь, что код, который вы компилируете. Перед тем, как брать скомпилированную сборку, проверьте ее на наличие ошибок, в случае возникновения какой-либо, разбейте перед тем, как брать созданную dll.

person Mark Smethwick    schedule 05.05.2015