回答
解決此問題有幾個選項。根據您希望解決方案如何擴展以及其複雜程度,您可能需要查看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一個人有幾個非常簡單的修改上面的代碼。
修改後的代碼是:
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最終會超時並被垃圾收集器收集。您需要調查終身管理以進一步擴展這一點。
非常感謝! – 2011-06-09 12:59:47
- 1. 工廠方法創建單例實例
- 2. 使用一種通用工廠方法創建實例
- 3. 創建一個應用程序,通過點擊創建其他應用程序
- 4. 無法在方法中創建其他實例引用
- 5. 使用實例工廠方法動態創建原型bean
- 6. 在MVC中使用工廠類(實例創建者)排序
- 7. 爲其他作用域中的指針創建實例
- 8. 如何在C#中創建通用的克隆工廠方法?
- 9. 爲什麼Fragment通過工廠方法實例化?
- 10. Android快捷方式無法在其他應用程序實例中刪除
- 11. factory_girl:工廠在創建時未通過驗證(時間),但在我的應用程序中,驗證通過
- 12. 創建一個鏈接,你的應用程序通過其他應用推出
- 13. php - 自動創建myClass的實例
- 14. 爲其他應用程序創建cookie
- 15. 通過創建所有對象創建多個應用程序實例的Java Swing應用程序設計
- 16. 在應用程序工廠中創建時導入Flask擴展
- 17. Android應用程序實例未創建
- 18. 在C#中創建通用接口的實例的方法
- 19. 創建通用類的通用工廠
- 20. 如何在其他文件中調用工廠方法
- 21. 使用jQuery UI Widget工廠創建實例變量的正確方法
- 22. 通過其他應用程序打開Facebook應用程序
- 23. 從一個唯一的實例值中創建一個枚舉工廠方法
- 24. 角廠。如何創建工廠的新實例?
- 25. 在javascript中調用實例創建回調的實例方法
- 26. 如何在Laravel的另一家工廠創建用戶實例?
- 27. 無法通過刀創建EC2實例
- 28. 我可以通過TOleContainer或其他方式直接在Delphi應用程序中實例化ActiveX控件嗎?
- 29. 使用工廠方法創建單例類
- 30. 創建域創建一個工廠的正確方式對象
試圖創建其他域並使用domain.Load(程序集路徑),但這不起作用FileLoadException – 2011-06-09 11:45:58
它在那個異常中說了什麼? – 2011-06-09 11:48:53
{「無法加載文件或程序集'C:\\ location \\ mydll.dll'或它的某個依賴項,給定的程序集名稱或代碼庫無效(異常來自HRESULT:0x80131047)」:「C:\\ location \\ mydll.dll「 – 2011-06-09 11:53:50