CSharpCodeProvider可用于将源.cs文件编译为程序集。 但是,默认情况下,程序集会自动加载到AppDomain.CurrentDomain中。就我而言,这是一个问题,因为我需要能够在运行时再次重新编译该程序集,并且由于该程序集已经加载到CurrentDomain中,所以我无法卸载它,因此卡住了。
我已经浏览了文档,似乎无法设置目标应用程序域。我也尝试在Google上搜索它,仅找到使用Assembly.Load的答案,我认为我无法使用它,因为我需要从原始源代码而不是.dll
进行编译如何去做呢?有其他选择或解决方法吗?
主程序
using (var provider = new CSharpCodeProvider())
{
param.OutputAssembly = "myCompiledMod"
var classFileNames = new DirectoryInfo("C:/sourceCode").GetFiles("*.cs", SearchOption.AllDirectories).Select(fi => fi.FullName).ToArray();
CompilerResults result = provider.CompileAssemblyFromFile(param, classFileNames);
Assembly newAssembly = result.CompiledAssembly // The assembly is already in AppDomain.CurrentDomain!
// If you try compile again, you'll get an error; that class Test already exists
}
C:/sourceCode/test.cs
public class Test {}
我已经尝试创建一个新的AppDomain并将其加载到其中。发生的结果是程序集最终被加载到两个域中。
// <snip>compile code</snip>
Evidence ev = AppDomain.CurrentDomain.Evidence;
AppDomain domain = AppDomain.CreateDomain("NewDomain", ev);
domain.Load(newAssembly);
答案 0 :(得分:0)
答案是使用CSharpCodeProvider()。CreateCompiler()代替CSharpCodeProvider,并将param.GenerateInMemory设置为false。现在,我可以看到行号,并且没有可见的程序集.dll文件正在创建,尤其是没有被锁定。这样可以将程序集保留在内存中,并在需要时重新加载它。