2010-07-27 4 views
0

특정 AppDomain을로드 했으므로 동적으로 일부 유형을로드하려고합니다. AppDomain 클래스의 CreateInstance 메서드는 모두 Remoting 개체 핸들로 반환합니다. 원격 프록시에는 LifeTimeService가 사용되지 않는 한 serializable concrete 클래스가 있어야하고 가비지 컬렉션을 열망하는 등의 피하고 싶은 제한이 있습니다..Net - 리모컨 프록시가없는 AppDomain에서 동적으로로드 유형

내 질문은 어떻게 원격 프록시에서 래핑하지 않고 다른 응용 프로그램 도메인에서로드 할 수 있습니까? 다음은 내 코드 스 니펫입니다.

AppDomainSetup ads = new AppDomainSetup(); 
ads.ApplicationBase = Path.GetDirectoryName(_bllAssemblyPath); 
ads.PrivateBinPath = Path.GetDirectoryName(_bllAssemblyPath); 
if (File.Exists(_bllAssemblyPath + ".config")) 
    ads.ConfigurationFile = _bllAssemblyPath + ".config"; 
_workerSpace= AppDomain.CreateDomain("worker", new System.Security.Policy.Evidence(AppDomain.CurrentDomain.Evidence), ads); 

_bllQueue = _workerSpace.CreateInstanceFrom(_bllAssemblyPath, queueType) as IThumbCapQueue; 
+0

나는 그렇게 할 수 있다고 생각하지 않습니다. 별도의 AppDomain에 개체를 만들어야하는 이유는 무엇입니까? –

+0

저는 Windows 서비스를 만들고 있는데 _bllQueue가 주 서비스 메모리 공간과 별도의 메모리 공간에서 호스팅되기를 바랍니다. – James

답변

1

.NET은 다른 앱 도메인의 개체 메모리에 직접 액세스 할 수 없으므로 항상 앱 도메인간에 대화를 나누려면 프록시 유형이 필요합니다. 또한 예제의 두 AppDomains는 동일한 Windows 프로세스 내에서 실행됩니다.

리모컨을위한 새로운 인프라가 있습니다 : RIA Services 당신이 원하는 기능을 제공 할 수 있습니다.

+0

+1 멋진 답변입니다. – James

0

리모컨에 관심이있는 개체를 만드는 대신 원격 AppDomain에 대한 통신 채널 역할을하는 원격 "부트 스트 래퍼"를 만들고 관심있는 것을로드하는 데 사용하십시오. 임의의 .NET dll을 반영해야하는 프로젝트에서 형식 정보를 가져와야합니다 (완료되면 어셈블리를 언로드하여 파일을 잠그지 않으므로 새 AppDomain에서 수행 함) - 리모팅 심이 어셈블리를로드하고, 리플렉션을 수행하고 필요한 정보를 수집 한 다음 직렬화 가능 개체 형태로 호출 AppDomain으로 다시 보냅니다. here을 참조하십시오.

+0

실제로 디스크에서로드 된 동적 구체 인스턴스를 직렬화 또는 원격으로 가져 오려고합니다. – James

+0

패턴이 여전히 유지됩니다. 어떤 일을하든 원격 프록시를 통해 보조 AppDomain과 통신해야하므로 관심있는 유형을 원격으로 만들거나 원격 심을 만들 수 있습니다. – nlawalker

+0

리모팅 심이 정확히 무엇입니까? – James

관련 문제