0

PersonVM以下に示すような名前のクラスを含むdllを作成しました。そしてその働き...

  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);


    }

しかし、このコードはインデックス コントローラーで 1 回だけ機能します。たとえば、ここで私の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

4

1 に答える 1

1

を使用して、同じ名前の DLL をアプリ ドメインに 2 回読み込むことはできませんAssembly.LoadFrom

MSDNの関数の備考セクションを参照してください。Assembly.LoadFrom

LoadFromメソッドには、次の欠点があります。代わりにLoadを使用することを検討してください 。

  • 同じ ID を持つアセンブリが既に読み込まれている場合、別のパスが指定されていても、LoadFrom は読み込まれたアセンブリを返します。

考えられる解決策の 1 つはCSharpCodeProvider、アセンブリにランダムな名前を生成してそれをロードすることですが、実行時にこれらのクラスを本当にビルドする必要があるかどうかを真剣に検討します。設計時にビルドして、2 つの異なる名前を付けるだけです。おそらく、バージョン confConfを のバージョンから派生させることさえできます。Index

于 2016-10-26T15:27:19.747 に答える