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 서버를 다시 시작하지 않고도 삭제할 수 없다는 것입니다. 코드가 언제든지 변경 될 수 있고 사람들이 웹 사이트에있을 때 서버를 다시 시작하고 싶지 않기 때문에 옵션이 없습니다.
해결 방법이 있습니까?
"언제든지 변경할 수있는 코드"는 인 - 메모리 어셈블리, 하나 당신을 위해 작동하지 않습니다 의미하지 않는 한 공상 메모리 누수 및로드와 저글링의 많은은 " 오른쪽 "조립. 일단로드되면 어셈블리를 언로드 할 수 없습니다 (원본과 관계 없음). AppDomain 만 언로드하면됩니다. 표현식 트리를 사용하여 코드를 동적으로 생성하지 않고 어셈블리를 컴파일해야하는 특별한 이유가 있습니까? –
dll에는 많은 논리가 있습니다. 데이터베이스 처리 또는 이메일 처리 라이브러리에 대해 생각해보십시오. 컴파일 된 코드는 항상 동일하지 않으며 때로는 데이터베이스 처리와 전자 메일 처리가 필요한 경우가 있습니다. 어쩌면 설명하는 것이 조금 어렵습니다. 난 그냥 런타임에 주 응용 프로그램의 bin 디렉토리에없는 DLL을 참조하고 싶습니다 –
@ 엘리 엘 - Haddad 이것은 예제 데이터입니다. 물론 필자는 필요한 곳에서 내 문자열을 이스케이프 처리합니다. 그러나 나는 당신을 위해 그것을 바 꾸었습니다. –