2012-01-09 4 views
2

사용자에게 직접 확장 성을 제공해야하는 응용 프로그램이 있습니다. 많은 데이터와 수학/수치 알고리즘을 사용하여 일종의 계산 엔진으로 생각할 수 있습니다. 나는 몇 가지 정적 필드 (데이터)와 메서드 (계산)를 제공하여 사용자가 유효한 C# 식을 작성하여 이중을 반환해야합니다.System.Addin을 사용하여 메모리에 어셈블리 생성

사용자가 텍스트 상자에 유효한 식을 입력하면 결과를 제공해야합니다. 현재 내가 수행하는 것은 http://blogs.msdn.com/b/abhinaba/archive/2006/02/09/528416.aspx의 단계에 따라 메모리에 생성 된 어셈블리의 정적 메서드에 식을 삽입하는 것입니다. 그런 다음 리플렉션을 사용하여 특정 메서드를 호출하고 결과를 반환합니다.

생성 된 어셈블리가 응용 프로그램의 수명주기 동안 누적된다는 사실을 제외하고는 정상적으로 작동합니다. 이 모든 것이 클라이언트 응용 프로그램이었을 때 좋았지 만 지금은 서버 기반 응용 프로그램으로 옮겨 가고 있으며 수시로 서비스를 다시 설정하고 싶지 않습니다.

어셈블리를 언로드하는 방법을 검색 할 때 System.Addin 네임 스페이스를 발견했습니다. 그것은 정확히 내가 원하는대로 수행합니다 : 어셈블리를 다른 AppDomain에로드하는 것입니다. 후자를 무시할 수 있습니다. 그것은 심지어 모든 반사를 캡슐화합니다.

유일한 문제는 AddInStore가 파일 경로를 예상하지만 모든 어셈블리가 실제로 사용 된 CompileParameters의 GenerateInMemory 속성을 설정하여 메모리에 생성된다는 것입니다. 내 어셈블리를 디스크에 쓰는 것이 절대적으로 필요한가요? 또는 런타임에 컴파일 된 어셈블리를 추가 기능으로 직접 사용할 수 있습니까?

안부, 카를로스

답변

0

난 당신이 (어셈블리를 언로드?)에 대한 AddInStore를 사용하는지 이해가 안하지만 당신은 당신이 당신이 동적으로로드 된 어셈블리를 만들 수 있었다 말했다있는 (AppDomain을 언로드 할 수 있습니다 에서) :

  AppDomain.Unload(yourAppDomain); 

아니면 더 큰 문제에 직면하고 있습니다.

0

아마도 DynamicMethod이 당신이 찾고있는 것입니다.

그렇지 않다면 IronPython을 살펴볼 수 있습니다. 응용 프로그램에 추가하는 것은 매우 쉽고 강력합니다. 물론 이것은 컴파일 된 C# 코드보다 느려질 것이지만 컴파일 + 리플렉션보다 느린 지 확실하지 않습니다.

물론 MZN이 언급하는 것을 할 수 있습니다. 다음과 같이 할 수 있습니다.

  1. MarshalByRefObj에서 파생되도록 컴파일러 클래스를 변경합니다. 이는 CLR이 프록시 개체를 만드는 데 필요합니다. 약간의 .Net Remoting을 점검해야합니다. 그렇게 많이는 아니지만.
  2. 마지막으로 새로운 응용 프로그램 도메인에 컴파일러 클래스로 assmebly을로드하고에 컴파일러의 인스턴스를 생성 CreateInstanceFromAndUnwrap의 오버로드 중 하나를 호출, 자신의 응용 프로그램 도메인을 만듭니다. 그것은 당신에게 프록시 객체를 돌려 줄 것입니다. 그런 다음 프록시 객체를 사용하여 컴파일 컴파일을 수행합니다. 컴파일 된 어셈블리가 새 AppDomain에로드됩니다. 이 어셈블리가 더 이상 필요하지 않거나 컴파일 된 어셈블리가 최대 개수에 도달하면 MZN에서 언급 한 호출을 수행하고 AppDomain 및로드 된 어셈블리를 모두 언로드 할 수 있습니다. 그런 다음 새로운 AppDomain에서 다시 전체 작업을 반복하십시오.

가장 쉬운 방법은 IronPython을 사용하는 것입니다.

그 순간 나는 System.CodeDom을 사용하여 현장에서 C# 코드를 컴파일하는 것을 포함하는 MAF 기반 응용 프로그램을 작업 중입니다. 그것은 당신과 비슷하지만 제 경우에는 컴파일이 업그레이드 후에 만 ​​이루어집니다. 그래서 많은 "스크립트"어셈블리가로드되어 있어도 문제가 없습니다. 또한 파일 시스템에 어셈블리를 빌드합니다.

감사와 행운,

유리창

관련 문제