在运行时生成DLL程序集并对其进行更改

本文关键字:运行时 DLL 程序集 | 更新日期: 2023-09-27 18:15:08

我创建了一个dll,其中包含一个名为PersonVM的类,如下所示。

  public ActionResult Index()
    {

        using (CSharpCodeProvider codeProvider = new CSharpCodeProvider())
        {
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateExecutable = false;
            parameters.OutputAssembly = "Per.dll";
            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, "public class PersonVM{ " + "public int id{get;set;}" +
                "public string Name{get;set;}" + "public string LName{get;set;}" + " }");
        }
        Assembly assembly = Assembly.LoadFrom("Per.dll");
        var type = assembly.GetType("PersonVM");
        var d = type.GetProperties();
        object obj = Activator.CreateInstance(type, true);
        return View(obj);

    }

,但这段代码只工作一次在我的索引控制器。例如,它没有改变我的DLL类在这里:

     public ActionResult Conf()
    {
        using (CSharpCodeProvider codeProvider = new CSharpCodeProvider())
        {
            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateExecutable = false;
            parameters.OutputAssembly = "Per.dll";
            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, "public class PersonVM{ " + "public int id{get;set;}" +
              "public string Name{get;set;}" + "public string LName{get;set;}" + "public string LNamee2 { get; set; }" + "public string L4 { get; set; }" + " }");
        }

        Assembly assembly = Assembly.LoadFrom("Per.dll");
        var type = assembly.GetType("PersonVM");

        object obj = Activator.CreateInstance(type, true);

        List<ClassInfoVM> model = obj.GetType().GetProperties()
            .Select(T => new ClassInfoVM()
            {
                PropName = T.Name,
                TypeOfProp = T.PropertyType.Name
            }).ToList();

        return View(model);
    }

没有关于任何错误的事情…它只是不改变我的DLL类…dll类PersonVM只是包含了我设置它的属性,第一次在Index

在运行时生成DLL程序集并对其进行更改

您不能使用Assembly.LoadFrom在应用程序域中两次加载相同名称的DLL。

请参阅MSDN上Assembly.LoadFrom函数的备注部分:

LoadFrom方法有以下缺点。考虑使用负载。

  • 如果具有相同标识的程序集已经加载,LoadFrom返回加载的程序集,即使指定了不同的路径。

一个可能的解决方案是让CSharpCodeProvider为程序集生成一个随机名称并加载它,但是如果我在哪里,我会认真考虑是否真的需要在运行时构建这些类。只需在设计时构建它们,并给它们起两个不同的名字。甚至可以使版本conf Conf派生自Index

中的版本