卸载动态编译的dll

时间:2018-01-23 14:21:29

标签: c# c#-4.0 dll .net-assembly appdomain

我有点问题。首先,我有一个程序,它有一个用于从脚本编译程序集的类,可以在程序中编写以使用程序数据。所以我不能卸载生成的程序集。试图使用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();
    }

0 个答案:

没有答案