using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
namespace IssuesWithGenerics {
class Program {
static AppDomain CreateSubAppDomain(DirectoryInfo applicationDir,
DirectoryInfo domainDir,
FileInfo domainConfig) {
AppDomain rootAppDomain = AppDomain.CurrentDomain;
AppDomainSetup rootSetup = rootAppDomain.SetupInformation;
AppDomainSetup subSetup = new AppDomainSetup();
subSetup.ApplicationName = rootSetup.ApplicationName;
subSetup.ApplicationBase = applicationDir.FullName;
subSetup.ConfigurationFile = domainConfig.FullName;
subSetup.PrivateBinPath = ".;.\\" + domainDir.Name;
subSetup.LoaderOptimization = LoaderOptimization.MultiDomain;
return AppDomain.CreateDomain(rootSetup.ApplicationName +
".SubAppDomain", null, subSetup);
}
static MbrFacade CreateMbrFacade(AppDomain ad) {
Type t = typeof(MbrFacade);
return (MbrFacade) ad.CreateInstanceAndUnwrap
(t.Assembly.FullName, t.FullName);
}
[LoaderOptimization(LoaderOptimization.MultiDomain)]
static void Main(string[] args) {
DirectoryInfo appDir = new DirectoryInfo
(AppDomain.CurrentDomain.SetupInformation.ApplicationBase);
DirectoryInfo domainDir = appDir.GetDirectories("SubAppDomain")[0];
FileInfo domainConfig = domainDir.GetFiles("AppDomain.config")[0];
AppDomain subAppDomain = CreateSubAppDomain
(appDir, domainDir, domainConfig);
ComponentRegistry cr = new ComponentRegistry();
MbrFacade mf = CreateMbrFacade(subAppDomain);
ILocalComponent lc = mf.Create(cr);
cr.Register(lc.ComponentId, lc as MbrFacade);
foreach (KeyValuePair<ComponentId, MbrFacade> kvp in cr) {
Console.WriteLine(kvp.Value.ComponentInfo);
}
Console.ReadLine();
}
}
public class ComponentRegistry : MarshalByRefObject,
IEnumerable<KeyValuePair<ComponentId, MbrFacade>> {
private Dictionary<ComponentId, MbrFacade> m_facades =
new Dictionary<ComponentId, MbrFacade>();
public void Register(ComponentId cid, MbrFacade mf) {
m_facades.Add(cid, mf);
}
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator() {
return m_facades.GetEnumerator();
}
IEnumerator<KeyValuePair<ComponentId, MbrFacade>>
IEnumerable<KeyValuePair<ComponentId, MbrFacade>>
.GetEnumerator() {
return m_facades.GetEnumerator();
}
}
[XmlType]
[Serializable]
public class ComponentId {
private string m_name;
public ComponentId(string name) {
m_name = name;
}
[XmlElement]
public string Name {
get {
return m_name;
}
set {
if (m_name == null) {
m_name = value;
}
}
}
}
[XmlType]
[Serializable]
public class ComponentInfo {
private List<ComponentId> m_componentIds;
public ComponentInfo() {
m_componentIds = new List<ComponentId>();
}
public List<ComponentId> ComponentIds {
get {
return m_componentIds;
}
}
}
public interface ILocalComponent {
ComponentId ComponentId {
get;
}
ComponentInfo ComponentInfo {
get;
}
}
public class MbrFacade : MarshalByRefObject, ILocalComponent {
private ILocalComponent m_localComponent;
public MbrFacade() {
}
public ILocalComponent Create(ComponentRegistry cr) {
m_localComponent = new LocalComponent(new ComponentId("test"));
return this;
}
public ComponentId ComponentId {
get {
return m_localComponent.ComponentId;
}
}
public ComponentInfo ComponentInfo {
get {
return m_localComponent.ComponentInfo;
}
}
public override object InitializeLifetimeService() {
return null;
}
}
public class LocalComponent : ILocalComponent {
private ComponentInfo m_componentInfo;
private ComponentId m_componentId;
public LocalComponent(ComponentId cid) {
m_componentId = cid;
m_componentInfo = new ComponentInfo();
}
public ComponentId ComponentId {
get {
return m_componentId;
}
}
public ComponentInfo ComponentInfo {
get {
return m_componentInfo;
}
}
}
}