현재 프로젝트에서 몇 가지 문제가 발생했습니다. 누군가 제게 약간의 통찰력 또는 조언을 제공해 주시면 감사하겠습니다.동적 코드 다시로드/유형 다시로드
내 프로젝트는 사용자 스크립트를 실행하는 서비스입니다. 스크립트는 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
내가 질문
다음 한 : 그리고 여기에 문제가 온다. 나는. 동일한 유형의 어셈블리를 계속해서로드하고로드하는 중입니다. 모든 것이 제대로 작동합니다.
2. 빌드 후에 S1을 사용하지 않으면 체크해도 S2를 빌드 할 수 있습니다. 모듈, 모든 어셈블리 L1, S1, L2, S2가로드되었음을 알 수 있습니다. 분명히 내가 어셈블리를로드 할 수 있지만 어떻게 든 그것을 사용하지 않는 "어셈블리로드 된 있지만 형식이로드되지 않았습니다." 정말로 무슨 일이 일어나고있는거야?
3. 내 문제의 해결 방법으로 제안 하시겠습니까? 임시 AppDomain을 사용하는 것이 가장 논리적 인 것처럼 보입니다. 그러나 그와 관련된 경험이 없기 때문에 매우 복잡해 보입니다. 더 간단한 솔루션이 있다면 차라리 사용하는 것이 좋습니다.
나는 주된 대답은 다음과 같을 것이라고 생각한다. AppDomain을 사용해 보라. (실제로 AppDomain을 사용하면 그다지 나쁘지 않다.) 또는 기존의 스크립팅 호스트를 살펴 보라. IronPython, IronRuby, ecmascript 및 Lua는 꽤 괜찮은 관리 스크립트 호스트를 가지고 있습니다. IIRC –