2010-06-23 3 views
4

내가있는 샌드 박스에 모듈을로드하는 데 사용하고 응용 프로그램 도메인이 : 나중에 다음내 C# AppDomain이 한순간에 훌륭한 이유는 무엇입니까? 다음에 예외가 발생합니다.

class PluginLoader 
{ 
    public static AppDomain PluginSandbox; 

    static PluginLoader() 
    { 
     AppDomainSetup ads = new AppDomainSetup(); 
     ads.ApplicationName = "Plugin Modules"; 
     PermissionSet trustedLoadFromRemoteSourceGrantSet = 
        new PermissionSet(PermissionState.Unrestricted); 
     PluginSandbox = 
        AppDomain.CreateDomain("Plugin App Domain", 
        null, ads, trustedLoadFromRemoteSourceGrantSet); 
    } 

와, 내가 필요로하는 DLL에 끌어와 개체 인스턴스 생성 할 것이다 :

 public IPlugin FindPlugin(string pluginName) 
    { 
      ObjectHandle handle = 
        PluginSandbox.CreateInstance(pluginName, 
         "Plugins." + pluginName); 
       IPlugin ip = (IPlugin)handle.Unwrap(); 
       return ip; 
    } 

문제없이이 과정을 몇 차례 통과했습니다. 샌드 박스에서 다양한 객체의 인스턴스를 아무런 문제없이 가져옵니다.

나중에 코드에서 다른 방법으로, 어셈블리를 찾아서 임베디드 리소스 (ManifestResource를 사용하여 데이터 파일로 컴파일 됨)를 가져와야합니다.

 Assembly [] ar = PluginSandbox.GetAssemblies(); 

을 그리고 오류가 발생됩니다 : 그래서 내가 전화

A first chance exception of type 'System.IO.FileNotFoundException' 
occurred in PluginRunner.dll. 

Additional information: Could not load file or assembly '10wl4qso, 
Version=1.0.3826.25439, culture info=neutral, PublicKeyToken=null' 
or one of its dependencies. The system cannot find the file specified. 

놀랐 아니에요. '10wl4qso'는 어셈블리, dll 또는 그와 유사한 것의 이름이 아닙니다. 실제로 각 실행에 대해 의사 무작위로 보입니다. 게다가 GetAssemblies의 추가 된 재미는이 예외를 던지기 위해 문서화되어 있지 않습니다.

이제 초기 객체를 얻은 후에 GetAssemblies을 호출 할 수 있습니다. 모든 것이 복숭아입니다. 그러나 몇 초 후, 다른 방법으로 이것을 얻습니다. PluginSandbox는 원격으로 사용되기 때문에 디버거에서 유용한 정보가 전혀 없습니다.

AppDomain에서 UnhandledException 및 DomainUnload를 catch하고 있는데 둘 다 트리거되지 않습니다.

내 AppDomain이 갑자기 어셈블리에 대해 알지 못하는 이유는 무엇입니까? 가비지 데이터의 출처는 어디입니까? 둘 중 하나 또는 둘 다 발생하지 않도록하려면 어떻게해야합니까?

답변

2

보고있는 이상한 이름의 어셈블리는 아마도 XmlSerializer에 의해 생성됩니다. XML serializer는 특정 형식을 신속하게 serialize 및 deserialize 할 수 있도록 동적 어셈블리를 출력합니다. 코드에서 XmlSerializer의 사용을 확인하고 주석을 달고 문제가 다시 발생하는지 확인하십시오.

+0

나는 모습을하고 시리얼 라이저는 원격 프록시에서 사용 할 수있는 것을 제외하고 사용하지 않아도 - 그 내되지 않습니다 . 하나를 찾았음에도 불구하고 여전히 내 AppDomain이 휴지통으로 바뀌는 이유에 대한 설명으로 이것을 구입하지 않습니다. –

+0

컴파일 된 정규 표현식을 사용하는 경우에도 이상한 이름의 어셈블리가 발생합니다. – Sean

0

도움이 될지 모르겠다. IPlugin에서 InitializeLifeTimeService를 재정의하려고합니다. IPlugin 구현은 먼저 MarshalByRefObject에서 상속해야합니다.

public class PluginSample : MarshalByRefObject, IPlugin 
{ 

    public overrides object InitializeLifetimeService() 
    { 
     return null; //Return null to infinite object remote life. 
    } 
    //...implementation 

} 

이 문서를 살펴 보자 RemotingException when raising events across AppDomains

관련 문제