2011-03-21 36 views
3

我想以獨立方式運行來自不同.dll的多個服務。基本上,所有的服務都來自RoleEntryPoint,我想分別加載一個0123',並在不同的線程中運行它。從其他.dll加載服務並將它們隔離運行

到目前爲止,我可以找到服務,並得到其類型:

 String pathToDll = @"C:\....\bin\Debug\ChildWorkerRole.dll"; 
     Assembly assembly = Assembly.LoadFrom(pathToDll); 
     Type serviceType = assembly.GetTypes().SingleOrDefault(t => t.BaseType == typeof(RoleEntryPoint)); 

而且也是在當前AppDomainThread運行它:

 RoleEntryPoint myRole2 = (RoleEntryPoint)Activator.CreateInstance(serviceType); 
     if (myRole2.OnStart()) 
      myRole2.Run(); 

但是,當我嘗試在運行它一個單獨的不同AppDomain我得到一個例外:

 AppDomain domain = AppDomain.CreateDomain("MyNewDomain"); 
     RoleEntryPoint myRole = (RoleEntryPoint)domain.CreateInstanceFromAndUnwrap(pathToDll, serviceType.FullName); 
     if (myRole.OnStart()) 
      myRole.Run(); 

這個ex ception:

System.Runtime.Serialization.SerializationException was unhandled 
    Message=Type 'ChildWorkerRole.WorkerRole' in assembly 'ChildWorkerRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable. 
    Source=mscorlib 
    StackTrace: 
     at System.AppDomain.CreateInstanceFromAndUnwrap(String assemblyName, String typeName) 
....... 

有趣的是ChildWorkerRole實際上是標有SerializableAttribute ...但可能是因爲RoleEntryPoint則不然,它不能做。

任何想法或解決方法?

謝謝!

回答

6

爲了使用單獨的AppDomain中的類型,它和您直接使用的所有類型都需要標記爲[Serializable],或者您需要從MarshalByRefObject中派生它們。

如果這是不可能的,唯一真正的選擇是製作一個代理類,您可以使用它,它遵循上述標準,並允許它在內部管理您的類型。

+0

我明白了。謝謝! :) – vtortola 2011-03-21 16:48:49

相關問題