2010-05-10 5 views
6

나는 컴파일 할 수 있고, 인스턴스를 얻고, 프로그래밍 방식으로 모든 C# 유형의 메소드를 호출 할 수있다. StackOverflow (How can I evaluate a C# expression dynamically?)를 포함하여 많은 정보가 있습니다. 내 문제는 내가 웹 환경에있어/bin 디렉토리에 아무 것도 저장할 수 없다는 것이다. 위에서 언급 한 링크가 제안하는 것처럼 "메모리 내장"을 컴파일 할 수는 있지만 현재 사용자 정의 어셈블리를 현재 AppDomain에서 "언로드"할 수는 없습니다. 잠시 후에 그것은 거대한 기억 문제가 될 것입니다. 새 AppDomain을 열거 나 "메모리 내에서"새 어셈블리를 컴파일하거나, 일부 표현식을 평가하거나, 새 AppDomain 내부에서 해당 어셈블리의 일부 멤버에 액세스하여 완료되면 AppDomain을 안전하게 종료 할 수 있습니까? ? 링크, 제안 등을 미리 감사드립니다.어셈블리를 디스크에 저장하지 않고 C# 식을 컴파일하고 실행할 수 있습니까?

+0

알려진 형식의 임의의 메서드에만 액세스해야하는 경우 (더 복잡한 식의 컴파일이 아닌 경우) Type 클래스 및 Delegate.CreateDelegate의 GetMethod 메서드를 사용할 수 있습니다. 가능한 경우 새로운 AppDomain을 사용하지 않는 것이 좋습니다. 올바른 마샬링을 얻으려면 많은 새로운 복잡성이있을 수 있기 때문입니다. –

+0

비행 중에 C# 표현식을 평가해야 할 필요가 있습니다. 같은 오래된 bool r = Eval ("3> 2"); Eval은 디스크를 건드리지 않고 bool을 평가하는 데 도움이되는 항목입니다. 그래서, 아니오, 반사만으로는 여기에서 도움이되지 않습니다. 고마워, 그래도 :) – Sasha

답변

2

닷넷 DynamicMethod을 살펴 보셨습니까? 이 유형은 Reflection.Emit을 사용하여 메모리 메소드에서 사용 가능한 가비지 콜렉션을 작성합니다. 이것은 정확히 당신이 찾고있는 것처럼 들립니다.

+0

전적으로 DynamicMethod 전체를 놓쳤습니다. 이미 읽는 중 ... b = Evaluate ("5 <6")와 같은 간단한 것을 평가하는 데 사용하는 방법을 여전히 볼 수 없습니다. 더보고, 나는 단지 뭔가를 놓친다. 고맙습니다! – Sasha

1
+0

저자는 내가 내 질문에 다음과 같이 말했습니다. 거대한 메모리 문제에 봉착했거나 자체 AppDomain에서 새 코드를 실행했습니다. 그러나 그 기사 자체는 재미있었습니다. 공유해 주셔서 감사합니다! – Sasha

관련 문제