所以我正在创建 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();
Run Code Online (Sandbox Code Playgroud)
删除文件的代码非常简单,如下所示:
var files = Directory.GetFiles(DirectoryPath);
foreach (var file in files)
{
File.Delete(file);
}
Run Code Online (Sandbox Code Playgroud)
知道为什么我无法删除这些文件吗?
请参阅CompilerResults.CompiledAssembly 属性中的注释
CompiledAssembly 属性的 get 访问器调用 Load 方法将已编译的程序集加载到当前应用程序域中。调用 get 访问器后,在卸载当前 AppDomain 之前,无法删除已编译的程序集。
所以当你这样做时:
Assembly assembly = results.CompiledAssembly;
Run Code Online (Sandbox Code Playgroud)
您已将编译的程序集加载到当前应用程序域中,因此已锁定该文件。为了能够删除生成的文件,您需要将其加载到单独的应用程序域中(此答案可能有助于了解执行此操作的具体细节)。
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |