2013-10-07 1 views
5

내 WPF 응용 프로그램에서 플러그인을 사용할 수 있도록 설정하려고합니다. .하지만 추가 응용 프로그램 도메인을 만들 수) 제안 것이 들어플러그인에 사용할 응용 프로그램 도메인 만들기 : "어셈블리에 입력이 직렬화 가능으로 표시되어 있지 않습니다.

을 내 App.xaml.cs를에 시작에서 다음을하고 있어요 :

private void LoadPlugins() 
    { 
     // Create and polish plugin app domain 
     AppDomain pluginAppDomain = AppDomain.CreateDomain("MyProject Plugin Container", null); 
     pluginAppDomain.UnhandledException += PluginAppDomain_UnhandledException; 

     //TODO: Load plugins from dlls 
    } 

    private void PluginAppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     Logger.FatalException("PluginAppDomain", e.ExceptionObject as Exception); 
    } 

을하지만 UnhandledException 이벤트를 부착하는 것은 예외와 함께 실패 :

'MyProject, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 1337'어셈블리의 'MyProject.App'유형이 직렬화 가능으로 표시되어 있지 않습니다.

무엇이 문제 일 수 있습니까?

답변

9

.NET Remoting은 AppDomain 하위 프로그램에서 PluginAppDomain_UnhandledException에 액세스해야합니다. PluginAppDomain_UnhandledException은 인스턴스 메서드이므로 자식 AppDomain은이 클래스의 현재 개체 ()를 통해 AppDomain에 액세스해야합니다. 이 작업에는 두 가지 방법이 있습니다. 하나는 클래스가 MarshalByRefObject에서 파생되도록하는 것입니다.이 클래스는 프록시를 통해 다른 AppDomains에서 인스턴스에 액세스 할 수있게합니다. 다른 방법으로 클래스를 SerializableAttribute으로 꾸미고 .NET Remoting이이 클래스의 인스턴스를 다른 AppDomains에 직렬화 할 수 있음을 알립니다. 이것이 직렬화 가능 오류를 얻는 이유입니다. 수업은 1) MarshalByRefObject에서 파생되지 않으며 2)는 Serializable으로 표시되지 않습니다.

내가 아는 한이 AppDomain에서이 이벤트를 구독하는 것은 좋지 않습니다. 이 클래스를 만들고 클래스가 Logger 인 경우에도 MarshalByRefObject에서 파생 된 것으로 보아도 AppDomains간에 예외를 전달하기 때문에 좋은 솔루션에서 먼 길을 갈 수 있습니다. 이 작업을 수행하려면 이 필요합니다.은 모두 이고 두 어셈블리가 모두 AppDomains에로드되도록 AppDomains간에 전달됩니다. 플러그인을 분리하려는 경우 문제가 될 수 있습니다.

내가 당신이라면 먼저 별도의 AppDomains를 다루지 않고 플러그인 인식이 가능하도록 만들 것입니다. AppDomains와 UnhandleExceptions을 합치는 것은 매우 복잡합니다.

그렇다면 MarshalByRefObject 파생 개체 (PluginAppDomain_UnhandledException이 정적 인 경우 Logger 만 있으면 충분)를 시도하고 Logger의 메서드에 문자열 만 전달하십시오.

그렇지 않으면 플러그인에 별도의 로그를 제공하거나 Windows 이벤트 로그를 사용합니다.