2013-02-08 7 views
0

현재 프로젝트에서 몇 가지 문제가 발생했습니다. 누군가 제게 약간의 통찰력 또는 조언을 제공해 주시면 감사하겠습니다.동적 코드 다시로드/유형 다시로드

내 프로젝트는 사용자 스크립트를 실행하는 서비스입니다. 스크립트는 C#으로 작성되었으며 CodeDomProvider를 사용하여 런타임에 어셈블리를 작성합니다. 어셈블리에는 단일 클래스가 포함됩니다.

public Script : ScriptBase 
{ 
    public override void Run(){} 
} 

사용자는 스크립트를 변경할 수 있으며 변경 사항을 감지 할 수 있습니다. ScriptBase 자식의 새 인스턴스를 만드는 내용을 다시 작성합니다. 스크립트 S1이 포함 된 원래 어셈블리 A1이 현재 AppDomain에로드 된 상태로 유지되지만 지불 할 의사가있는 가격이라는 것을 알고 있습니다. 이 시나리오는 아무런 문제없이 작동합니다.

사용자 정의 라이브러리 용 기능을 추가하고자했습니다 (런타임에도 편집 가능). 이제는 라이브러리 S1을 사용하는 Script S1이 생겼습니다. 사용자가 L1을 변경하면 분명히 모든 스크립트를 다시 작성해야합니다. 내 첫 번째 시나리오가 작동 오는 방법

build L1 with type T1 
build S1 --depends--> L1 
(use S1) 
build L2 with type T1 
build S2 --depends--> L2 = crashes type T1 is defined in L1 and L2 
(use S1) //It passes through if I didn't use S1 for the first time 

내가 질문

  1. 다음 한 : 그리고 여기에 문제가 온다. 나는. 동일한 유형의 어셈블리를 계속해서로드하고로드하는 중입니다. 모든 것이 제대로 작동합니다.

    2. 빌드 후에 S1을 사용하지 않으면 체크해도 S2를 빌드 할 수 있습니다. 모듈, 모든 어셈블리 L1, S1, L2, S2가로드되었음을 알 수 있습니다. 분명히 내가 어셈블리를로드 할 수 있지만 어떻게 든 그것을 사용하지 않는 "어셈블리로드 된 있지만 형식이로드되지 않았습니다." 정말로 무슨 일이 일어나고있는거야?

    3. 내 문제의 해결 방법으로 제안 하시겠습니까? 임시 AppDomain을 사용하는 것이 가장 논리적 인 것처럼 보입니다. 그러나 그와 관련된 경험이 없기 때문에 매우 복잡해 보입니다. 더 간단한 솔루션이 있다면 차라리 사용하는 것이 좋습니다.

은 내가 AppDomain을 여기 최선이라고 생각하면

+1

나는 주된 대답은 다음과 같을 것이라고 생각한다. AppDomain을 사용해 보라. (실제로 AppDomain을 사용하면 그다지 나쁘지 않다.) 또는 기존의 스크립팅 호스트를 살펴 보라. IronPython, IronRuby, ecmascript 및 Lua는 꽤 괜찮은 관리 스크립트 호스트를 가지고 있습니다. IIRC –

답변

0

감사드립니다. Marc가 말했듯이 문제를 발견 한 정보를 찾는 것만으로도 당신이하는 일을 알게되면 정말 그렇게 나쁘지 않습니다.

이제

, 뻔뻔한 플러그 : 나는 반사 어셈블리를로드에 도움이 StackOverflow의 다른 질문에 대한이 저장소를 만들고, 그것은 경계를 넘어 함께 통신하는 응용 프로그램 도메인 설정의 기초를 커버해야 다음에서 Plugin Demo

을 당신의 질문을 보아도 섀도 복사 부분을 무시하고 호스트 프로젝트의 스캐너/통신 부분 만 사용해도됩니다.

+0

글쎄, 그 대답에서, 누군가는 어셈블리에서 타입이로드 될 때를 결정하는 것에 대해서도 설명 할 것이라고 기대했습니다. 어쨌든, 당신의 본보기는 매우 도움이되었고, 나는 그 점에 대해 대단히 감사합니다. – Biggles