C# Compile at Runtime Visual Studio unusual behavi

2019-05-29 07:52发布

问题:

Helo,

i have a strange behavior in Visual Studio. My code is a compiling at runtime, in VS it workts fine but if i start the programm from release-folder the compiled dll seems to be blocked, what is not that unusal but why does VS dont say that? Can some one tell me also how to unload a compiled dll in runtime?

VS:

Release-Folder:

My Test Code here:

static void Main(string[] args)
    {
        var property = "Value";
        var key = "MyKey";
        var binding = string.Format("{0}.{1}", key, property);
        var dllName = string.Format("Condition_{0}_{1}.dll", key, property);

        var input = "65535";

        var condition = "Convert.ToInt64(input) > 0xFFFF ? 0 : 501";

        for (var i = 0; i < 5; i++)
        {
            try
            {
                var conditionCompiled = BuildCondition(key, property, condition);
                Type moduleType = null;

                if (conditionCompiled.Errors.HasErrors)
                {
                    if (conditionCompiled.Errors[0].ErrorNumber != "CS0042")
                        throw new ConditionCompileException(conditionCompiled.Errors[0].ErrorText);

                    var assemblyPath = Path.Combine(Directory.GetCurrentDirectory(), dllName);
                    var assembly = Assembly.LoadFile(assemblyPath);
                    moduleType = assembly.GetType("DynaCore.ConditionRunner");
                }
                else
                {
                    var module = conditionCompiled.CompiledAssembly.GetModules()[0];
                    moduleType = module.GetType("DynaCore.ConditionRunner");
                }

                var method = moduleType.GetMethod("RunCondition");

                var value = method.Invoke(null, new object[] { input });

                Console.WriteLine("DynaCore.ConditionRunner.RunCondition({0}) => {1}", input, value);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                if (e.InnerException != null)
                    Console.WriteLine(e.InnerException.Message);
            }
        }

        Console.ReadLine();
    }

    private static CompilerResults BuildCondition(string name, string property, string condition)
    {
        var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
        var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, string.Format("Condition_{0}_{1}.dll", name, property), true);
        parameters.GenerateExecutable = false;

        var results = csc.CompileAssemblyFromSource(parameters, string.Format(
        @"  using System.Linq;
            using System;                
            using DESFireSDK.Dependency;

            namespace DynaCore
            {{
                class ConditionRunner 
                {{
                    public static object RunCondition(string input) 
                    {{
                        return {0};
                    }}
                }}
            }}"
        , condition));

        return results;
    }