在运行时编译整个C#项目

时间:2017-10-16 14:26:23

标签: c# .net dll

我正在尝试在另一个C#项目(项目B)中编译整个C#项目(项目A)并尝试尽可能在内存中生成它。

我正在将所有Project A的源代码和对其DLL(我在编译时不知道)的引用加载到内存中。 我还将在项目A中添加或更新未知数量的文件,包括还需要添加或更新的任何其他DLL。

目前,DLL存储在一个临时文件夹中,并且位于List<string>的完全限定路径中。

然后我尝试编译Project A的整个源代码:

CompilerParameters compilerParameters = new CompilerParameters();
compilerParameters.GenerateInMemory = true;
compilerParameters.GenerateExecutable = false;
compilerParameters.ReferencedAssemblies.AddRange(assemblyLocationsList);
CompilerResults compilerResults = new CSharpCodeProvider().CompileAssemblyFromSource(compilerParameters, rawSources);

其中assemblyLocationsList是DLL位置的ListrawSources是项目A原始源代码的string[]

我遇到的问题是compilerResults.Errors.HasErrors会返回false,但是,当我尝试获得compilerResults.CompiledAssembly的结果时,我面临FileNotFoundException并且它出现了“缺少”“EntityFramework.dll”。我已检查并确保DLL存在于指定的路径中,并且Project B可以访问该文件,它可以访问该文件。

我可能会误解CompileAssemblyFromSource如何解析compilerParameters.ReferencedAssemblies(我指定的完全限定路径)以及我想要做的事情是否可以实现。

项目B是否需要Assembly.Load程序集才能“识别”项目A的DLL,然后才能在compilerParameters.ReferencedAssemblies中使用它们?

我还想知道是否可以将程序集保留在内存中(可能是List或类似的),然后使用“位置”(使用Assembly.Load {{加载到内存中时) 1}}是空的)在Assembly.Location中引用它们或者我只是不得不将它们写入磁盘并从临时位置读取它们还是有替代/更好的方法来解决这个问题?

我正在尝试编译代码,因此我最终可以使用compilerParameters.ReferencedAssemblies在内部播放代码,即读取标题,属性等。

提前致谢。

0 个答案:

没有答案