2010-12-22 2 views
0

Emit을 사용하여 프로젝트에서 일부 동적 유형을 생성합니다. 특히 내 서비스 인터페이스에서 "Decorators"를 대체합니다. WellKnownServiceType으로 .Net Remoting에 등록 된 클래스에 대해서도이 작업을 수행하고 있습니다. 그러나 .Net Remoting은 동적으로 방출되는 유형과 잘 작동하지 않는 것 같습니다. 첫째, 내가 가진 :.Net Remoting 서비스에 동적 유형 등록 문제.

System.IO.FileNotFoundException: Could not load file or assembly 'Dynamic, Version=0.0.0.0, Culture=neutral, PublicKeyToken=XXXX' or one of its dependencies. The system cannot find the file specified. 

은 물론 파일이 존재하지 않는, 어셈블리가 동적이며, 나는 방출을 설정 한 경우에만 "실행"조립하지 SaveAndRun합니다.

그래서 형식을 등록하기 전에 Assembly.Load (type.Assembly.GetName())을 호출합니다. 지금, 내가 얻을 :

System.Runtime.Remoting.RemotingException: Requested Service not found 
Server stack trace: 
    at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) 

오류는 서버에서 예외로 클라이언트에 나타납니다. 서버 로그에 오류가 표시되지 않습니다.

아무도 이것이 "잘 알려진"문제인지, 동적 유형을 .net 원격 서비스를 호스팅하는 데 사용할 수 없는지에 대한 단서가 있습니까? 힌트 또는 포인터를 사용하여 해결할 수 있습니까?

** UPDATE * *** 내가 방출 사용을 중단했습니다. Emit은 핵심 어셈블리에 "InternalsVisibleTo"특성을 넣어야했습니다.이 특성은 난독 화에 심각하게 영향을 미쳤습니다. 대신 CodeDom 네임 스페이스를 사용하여 코드 생성으로 전환했습니다. 아름답게 작동합니다. 작업을 수행하는 실제 소스 코드를 볼 수 있으며 이는 디버깅 할 때 매우 유용합니다.

답변

1

최근에 똑같은 문제가 발생했습니다. 당신은 아마 스택 추적에서 나타났습니다으로 는, 문제는 당신이 assemebly 사용자 정의의 로딩을 제어 할 수 있도록하는 AssemblyResolve 이벤트 핸들러를 제공 할 수

Server stack trace: 
    ... 
    at System.Reflection.Assembly.Load(...) 
    at System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.LoadType(String typeName, String assemblyName) 
    at System.Runtime.Remoting.RemotingConfigHandler.RemotingConfigInfo.GetServerTypeForUri(String URI) 
    at System.Runtime.Remoting.RemotingConfigHandler.GetServerTypeForUri(String URI) 
    at System.Runtime.Remoting.RemotingServices.GetServerTypeForUri(String URI) 
    at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(...) 

Assembly.Load

에서 온다. vis :

AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args) 
{ 
    if (args.Name.Equals(type.Assembly.FullName)) 
     return type.Assembly; 
    return null; 
}; 
+0

AssemblyResolve가 동적으로 "방사 된"어셈블리와 함께 작동하는지 확실하지 않습니다. –