运行时编译会生成无法删除的文件
本文关键字:删除 文件 编译 运行时 | 更新日期: 2023-09-27 18:36:22
我有这个控制台类型的东西,它接受一行 C# 代码,将其包装在周围的一些代码中并将其编译成程序集。然后,我从该程序集调用该方法,输出结果,仅此而已。
问题是,程序集需要有一个名称,以便我可以将其设置为友元程序集,以便它可以访问非公共类。我将其命名为"控制台"。
一切都按预期工作,但问题是我无法在完成后运行第二个脚本,因为名为"console"的文件已经存在于目录中并且无法覆盖。
我尝试过处理所有具有处置方法的东西。我尝试使用File.Delete手动删除文件。没有任何帮助。
所以这是我正在使用的代码。我希望有人能帮助我。
CSharpCodeProvider provider = new CSharpCodeProvider();
var param = new CompilerParameters();
param.GenerateInMemory = false;
param.GenerateExecutable = false;
param.OutputAssembly = "console";
param.ReferencedAssemblies.Add("System.dll");
param.ReferencedAssemblies.Add("System.Core.dll");
param.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);
var results = provider.CompileAssemblyFromSource(param,
@"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace FireflyGL
{
class DebugConsole
{
static void Run(StringWriter writer)
{
var stdOut = Console.Out;
Console.SetOut(writer);
" + input.Text + @"
Console.SetOut(stdOut);
}
}
}");
if (results.Errors.HasErrors)
{
for (int i = 0; i < results.Errors.Count; ++i)
{
PushText(results.Errors[i].ErrorText);
}
}
else
{
try
{
var writter = new StringWriter();
results.CompiledAssembly.GetType("FireflyGL.DebugConsole").GetMethod("Run", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { writter });
PushText(writter.ToString());
history.Add(input.Text);
currentHistory = history.Count;
input.Text = "";
writter.Dispose();
}
catch (Exception)
{
}
}
provider.Dispose();
File.Delete(results.CompiledAssembly.Location);
您必须卸载程序集才能删除所有引用。不幸的是,你不能那样做。但是,您可以卸载AppDomain
,并且只要您在该AppDomain
中引用您的程序集,它也将被卸载。
如果您不关心创建内存泄漏,也可以只为程序集创建唯一的名称(console1
、console2
等)。...