2016-10-26 8 views
0

私はdllを作成しました。あなたが下記のように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); 


    } 

しかし、このコードはインデックスコントローラで一度だけ動作しています。 例えばその、ここで私の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

+0

実行時にこれらのクラスをビルドしているのはなぜですか?あなたのコメントのために –

+0

ありがとうございます。私は実際にこのクラスをビューモデルとして使用したいと考えています。つまり、ユーザーがビューモデルと多分モデルをダイナミックに提供できるようにしたいということです。 in mvc EntityFramework –

答えて

1

Assembly.LoadFromを使用して、同じ名前のDLLをアプリケーションドメインに2回ロードすることはできません。

は、MSDNにAssembly.LoadFrom機能のthe Remarks sectionを参照してください。

LoadFrom方法は、次のような欠点があります。代わりに Loadを使用することを検討してください。

  • 同じIDを持つアセンブリが既にロードされている場合、別のパスが指定されていても、ロードされたアセンブリが返されます。

一つの可能​​な解決策は、あなたが本当にこれらのクラスを実行時に構築する必要がある場合、私は真剣に検討するところが私ならば、CSharpCodeProviderはアセンブリのためのランダムな名前を生成し、それをロードしてみましょうさ。設計時にそれらを構築し、2つの異なる名前を付けてください。おそらく、バージョンのconfをConfバージョンから控えてください。Index

+0

私はAssembly.Loadを試しましたが、i'vに「ファイル、アセンブリを 'Per、Version = 0.0.0.0、Culture = neutral、PublicKeyToken = null」またはその依存関係の1つをロードできませんでした。ファイルが指定されました。 –

+0

は、Per.dllをappdomainにロードするためのその良い解決策ですか? –

関連する問題