我有点问题。首先,我有一个程序,它有一个用于从脚本编译程序集的类,可以在程序中编写以使用程序数据。所以我不能卸载生成的程序集。试图使用AppDomain.Unload,但它显示文件“Scripts.DLL”正忙。我可以帮忙。这是我的代码。 非常感谢!
private void StartButton_Click(object sender, EventArgs e)
{
IScriptableComponent component = new DummyComponent();
var compiledAssemblyPath = Path.Combine(Environment.CurrentDirectory, ScriptsDirectory, CompiledScriptsAssemblyName);
var scriptFiles = Directory.EnumerateFiles(ScriptsDirectory, "*.cs", SearchOption.AllDirectories).ToArray();
var scriptAssembly = Helper.CompileAssembly(scriptFiles, compiledAssemblyPath);
var scriptTypes = Helper.GetTypesImplementingInterface(scriptAssembly, typeof(IScript));
foreach (var scriptType in scriptTypes)
{
var script = (IScript)Activator.CreateInstance(scriptType);
script.Run(component);
}
}
助手类:
public static Assembly CompileAssembly(string[] sourceFiles, string outputAssemblyPath)
{
var codeProvider = new CSharpCodeProvider();
var compilerParameters = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = false,
IncludeDebugInformation = false,
OutputAssembly = outputAssemblyPath
};
compilerParameters.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);
var result = codeProvider.CompileAssemblyFromFile(compilerParameters, sourceFiles);
if (result.Errors.HasErrors) throw new Exception("Assembly compilation failed.");
return result.CompiledAssembly;
}
public static List<Type> GetTypesImplementingInterface(Assembly assembly, Type interfaceType)
{
if (!interfaceType.IsInterface) throw new ArgumentException("Not an interface.", "interfaceType");
return assembly.GetTypes()
.Where(t => interfaceType.IsAssignableFrom(t))
.ToList();
}