rendered paste body// This example uses 3 projects:
// - Main client app, Client.csproj -> Client.exe
// - Common assembly, CommonLib.csproj -> CommonLib.dll
// - Server assembly, OtherLib.csproj -> OtherLib.dll
// --------------------------------
// Program.cs in main client app
namespace Client
{
using System;
using CommonLib;
internal sealed class Program
{
private static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyLoad += OnAssemblyLoad;
Console.WriteLine("Loading domain...");
AppDomain otherDomain = AppDomain.CreateDomain("OtherLibDomain");
otherDomain.AssemblyLoad += OnOtherAssemblyLoad;
Console.WriteLine("Creating instance...");
ICommon common = (ICommon)otherDomain.CreateInstanceAndUnwrap("OtherLib", "OtherLib.ConcreteClass");
Console.WriteLine("Getting data...");
CommonData data = common.GetData();
Console.WriteLine("Data was '" + data.Data + "'.");
Console.WriteLine("Unloading domain...");
AppDomain.Unload(otherDomain);
}
private static void OnAssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
Console.WriteLine("Loading assembly '{0}' in MY domain.", args.LoadedAssembly.FullName);
}
private static void OnOtherAssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
Console.WriteLine("Loading assembly '{0}' in OTHER domain.", args.LoadedAssembly.FullName);
}
}
}
// --------------------------------
// CommonData.cs in common assembly
namespace CommonLib
{
using System;
[Serializable]
public class CommonData
{
public CommonData(string data)
{
this.Data = data;
}
public string Data { get; private set; }
}
}
// --------------------------------
// ICommon.cs in common assembly
namespace CommonLib
{
using System;
public interface ICommon
{
CommonData GetData();
}
}
// --------------------------------
// ConcreteClass.cs in server assembly
namespace OtherLib
{
using System;
using CommonLib;
public class ConcreteClass : MarshalByRefObject, ICommon
{
public ConcreteClass()
{
}
public CommonData GetData()
{
return new CommonData("ConcreteClass");
}
public override object InitializeLifetimeService()
{
// Null means infinite object lease
return null;
}
}
}