2016-12-16 7 views
0

C# 코드를 메모리에있는 문자열로 컴파일하고 런타임에 사용하는 함수를 만들었습니다. 그것은 아주 잘 작동합니다.런타임시 참조 된 어셈블리로 컴파일

다음으로 작은 클래스 라이브러리 (mynew.dll을 호출하도록 함)를 만들어 c : \ mylibraries \ mynew.dll에 배치했습니다.

내 코드에서 참조 된 어셈블리를 추가 할 수 있습니다. 나는 이것을 좋아한다 :

CSharpCodeProvider provider = new CSharpCodeProvider(); 
CompilerParameters parameters = new CompilerParameters 
{ 
    GenerateExecutable = false, 
    GenerateInMemory = true 
}; 

parameters.ReferencedAssemblies.Add(@"c:\mylibraries\mynew.dll"); 

CompilerResults results = provider.CompileAssemblyFromSource(parameters, mycode); 

내 C# 코드 문자열 (mycode)은 "Execute"라는 함수이다. '나는 갑자기 작동되는 기본 응용 프로그램의 bin/debug 폴더에 DLL을 복사 할 때

Could not load file or assembly 'MyNew, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

,하지만 난 돈 :이 함수의 mynew.dll에서 네임 스페이스와 클래스를 선언 할 때이 오류를 얻을 수 이걸 원해. 런타임에 컴파일 된 코드를 주 응용 프로그램이 아닌 사용하기를 원합니다.

내가 여기에 게시하기 전에했던이

:

  • 검색에 유래
  • 메모리에 디스크에 DLL을 컴파일 구글
  • 시도 사용하지. 이 문제는 ... 지금 문제는 DLL이 IIS에 잠겨 있으며 IIS 서버를 다시 시작하지 않고도 삭제할 수 없다는 것입니다. 코드가 언제든지 변경 될 수 있고 사람들이 웹 사이트에있을 때 서버를 다시 시작하고 싶지 않기 때문에 옵션이 없습니다.

해결 방법이 있습니까?

+1

"언제든지 변경할 수있는 코드"는 인 - 메모리 어셈블리, 하나 당신을 위해 작동하지 않습니다 의미하지 않는 한 공상 메모리 누수 및로드와 저글링의 많은은 " 오른쪽 "조립. 일단로드되면 어셈블리를 언로드 할 수 없습니다 (원본과 관계 없음). AppDomain 만 언로드하면됩니다. 표현식 트리를 사용하여 코드를 동적으로 생성하지 않고 어셈블리를 컴파일해야하는 특별한 이유가 있습니까? –

+0

dll에는 많은 논리가 있습니다. 데이터베이스 처리 또는 이메일 처리 라이브러리에 대해 생각해보십시오. 컴파일 된 코드는 항상 동일하지 않으며 때로는 데이터베이스 처리와 전자 메일 처리가 필요한 경우가 있습니다. 어쩌면 설명하는 것이 조금 어렵습니다. 난 그냥 런타임에 주 응용 프로그램의 bin 디렉토리에없는 DLL을 참조하고 싶습니다 –

+0

@ 엘리 엘 - Haddad 이것은 예제 데이터입니다. 물론 필자는 필요한 곳에서 내 문자열을 이스케이프 처리합니다. 그러나 나는 당신을 위해 그것을 바 꾸었습니다. –

답변

-1

Directory.GetFiles를 사용하여 파일 시스템에서 어셈블리를 찾고 System.Reflection.Assembly.LoadFile을 사용하여 어셈블리를로드 한 다음 필요한 형식을 찾으십시오. 구체적인 유형을 알 필요가 없도록 구체적인 클래스에서 구현할 인터페이스를 사용하십시오.

이 스레드는 데 도움이 될 것입니다 Finding objects that implement interface from loaded assembly -how to compare types?