2011-06-09 33 views
0

我試圖通過工廠方法在其他應用程序域中創建MyClass的實例,是否有解決此問題的方法? 編輯: 問題是如何去做通過工廠方法在其他應用程序域中創建myClass的實例

謝謝。

+0

試圖創建其他域並使用domain.Load(程序集路徑),但這不起作用FileLoadException – 2011-06-09 11:45:58

+0

它在那個異常中說了什麼? – 2011-06-09 11:48:53

+0

{「無法加載文件或程序集'C:\\ location \\ mydll.dll'或它的某個依賴項,給定的程序集名稱或代碼庫無效(異常來自HRESULT:0x80131047)」:「C:\\ location \\ mydll.dll「 – 2011-06-09 11:53:50

回答

2

解決此問題有幾個選項。根據您希望解決方案如何擴展以及其複雜程度,您可能需要查看MAF(請參閱System.AddIn名稱空間),因爲它處理加載AddIns並已支持AppDomain分離。它還實現了AppDomain中創建的對象的生命週期管理以及加載/卸載AddIns和版本控制的全部功能。

如果您寧願實施自己的,或者只是想更多地瞭解AppDomains,那麼這裏有一個希望有所幫助的例子。它不會對AppDomain設置,安全性或生命週期管理做任何事情,並且爲了使代碼更緊湊,沒有錯誤處理,但它可以用作指導。

如果你開始,當一個人的對象是用工廠創建了一個例子:

public class Person 
{ 
    internal Person(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

public class PersonFactory 
{ 
    public static Person CreatePerson(string name) 
    { 
     return new Person(name); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Person p = PersonFactory.CreatePerson("John Smith"); 
    } 
} 

然後,您可以添加到這個建立在另一個的AppDomain一個人有幾個非常簡單的修改上面的代碼。

  • 使類人一個MarshalByRefObject的
  • 另一個屬性添加到個人將輸出自己的AppDomain測試
  • 添加另一個靜態方法工廠在不同的AppDomain創建
  • 修改後的代碼是:

    public class Person : MarshalByRefObject 
    { 
        internal Person(string name) 
        { 
         Name = name; 
        } 
    
        public string Name { get; private set; } 
        public string AppDomainName { get { return AppDomain.CurrentDomain.FriendlyName; } } 
    } 
    
    public class PersonFactory 
    { 
        public static Person CreatePerson(string name) 
        { 
         return new Person(name); 
        } 
    
        public static Person CreatePersonInAppDomain(string name, AppDomain domain) 
        { 
         return (Person)domain.CreateInstanceAndUnwrap(
          typeof(Person).Assembly.FullName, 
          typeof(Person).FullName, 
          false, 
          BindingFlags.NonPublic | BindingFlags.Instance, 
          null, 
          new object[] { name }, 
          null, 
          null 
          ); 
        } 
    } 
    
    class Program 
    { 
        static void Main(string[] args) 
        {    
         AppDomain domain = AppDomain.CreateDomain("NewDomain"); 
    
         Person person1 = PersonFactory.CreatePerson("John Smith"); 
         Person person2 = PersonFactory.CreatePersonInAppDomain("Jane Smith", domain); 
    
         Console.WriteLine("Person: Name={0}, Domain={1}", person1.Name, person1.AppDomainName); 
         Console.WriteLine("Person: Name={0}, Domain={1}", person2.Name, person2.AppDomainName); 
        } 
    } 
    

    輸出應爲:

     
    Person: Name=John Smith, AppDomain=[your exe name] 
    Person: Name=Jane Smith, AppDomain=NewDomain 
    

    那麼,發生了什麼?

    由於person2是另一個AppDomain中的對象,因此它可能需要是Serializable或從MarshalByRefObject派生。在這個例子中,我已經從MarshalByRefObject派生出來,所以實際的實例只存在於第二個AppDomain中,而原始AppDomain中的引用實際上是一個代理。如果我選擇了Serializable實現,那麼這個人的副本將被傳回原始的AppDomain。

    這是需要考慮的其他事情,因爲每次調用新的AppDomain時都需要編組任何參數,這會對性能產生一些影響。此外,對象的生命週期也需要考慮,因爲MarshalByRefObjects最終會超時並被垃圾收集器收集。您需要調查終身管理以進一步擴展這一點。

    +0

    非常感謝! – 2011-06-09 12:59:47

    相關問題