如何卸载由CSharpCodeProvider创建的程序集?

时间:2019-11-23 18:40:02

标签: c# csharpcodeprovider

问题

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);

1 个答案:

答案 0 :(得分:0)

答案是使用CSharpCodeProvider()。CreateCompiler()代替CSharpCodeProvider,并将param.GenerateInMemory设置为false。现在,我可以看到行号,并且没有可见的程序集.dll文件正在创建,尤其是没有被锁定。这样可以将程序集保留在内存中,并在需要时重新加载它。