2016-10-26 4 views
0

나는 아래에 보이는 것과 같이 PersonVM이라는 클래스를 포함하는 DLL을 만들었습니다. 그리고 그 작업 ...런타임에 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을 두 번로드 할 수 없습니다.

은 MSDN에 Assembly.LoadFrom 기능의 the Remarks section를 참조하십시오

LoadFrom 방법은 다음과 같은 단점이 있습니다. 대신 Load을 사용해보세요.

  • 동일한 ID를 가진 어셈블리가 이미로드 된 경우 다른 경로가 지정된 경우에도로드 된 어셈블리가 반환됩니다.

한 가지 가능한 솔루션은 정말 그 클래스가 런타임에 내장 할 필요가 있다면 내가 심각하게 고려할 경우 그러나 나는 경우, CSharpCodeProvider 어셈블리에 대한 임의의 이름을 생성하고로드 할 수있다. 그냥 디자인 타임에 그들을 빌드하고 그들에게 두 가지 이름을 줘. 버전 구성을 Conf으로 설정하십시오. Index

+0

Assembly.Load 시도했지만 i'v있어 : "파일, 어셈블리를로드 할 수 없습니다 '버전, 버전 = 0.0.0.0, Culture 중립, PublicKeyToken = null 또는 해당 종속성 중 하나. 시스템에서 찾을 수 없습니다. 지정된 파일. " –

+0

은 Per.dll을 appdomain에로드하는 좋은 해결책입니까 ?? –