所以我正在创建dll类型文件,运行它们然后我想删除它们。
然而,当我尝试删除它们时,我得到一个例外,因为它声称它们仍然被另一个进程使用。
我假设用于创建文件的代码没有正确处理资源以允许删除文件,这是我创建文件的代码。
if (!Directory.Exists(PathToRobots + Generation))
{
Directory.CreateDirectory(PathToRobots + Generation);
}
File.WriteAllText(Path.Combine(PathToRobots + Generation, NameSpace + GetRobotName() + robotNumber + ".cs"), code);
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters()
{
GenerateInMemory = false,
GenerateExecutable = false, // True = EXE, False = DLL
IncludeDebugInformation = true,
OutputAssembly = Path.Combine(FileName + ".dll") // Compilation name
};
parameters.ReferencedAssemblies.Add(@"robocode.dll");
CompilerResults results = provider.CompileAssemblyFromSource(parameters, code);
if (results.Errors.HasErrors)
{
StringBuilder sb = new StringBuilder();
foreach (CompilerError error in results.Errors)
{
sb.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
}
throw new InvalidOperationException(sb.ToString());
}
Assembly assembly = results.CompiledAssembly;
provider.Dispose();
删除文件的代码非常简单,如下所示,
var files = Directory.GetFiles(DirectoryPath);
foreach (var file in files)
{
File.Delete(file);
}
知道为什么我不能删除这些文件吗?
答案 0 :(得分:0)
请参阅CompilerResults.CompiledAssembly Property
上的说明CompiledAssembly属性的get访问器调用Load方法将已编译的程序集加载到当前应用程序域中。调用get访问器后,在卸载当前AppDomain之前无法删除已编译的程序集。
所以当你这样做时:
Assembly assembly = results.CompiledAssembly;
您已将已编译的程序集加载到当前应用程序域中,因此已锁定该文件。为了能够删除生成的文件,您需要将其加载到单独的应用程序域中(this answer可能有助于执行此操作的具体细节。)