All pastes #2096086 Raw Edit

Anonymous

public text v1 · immutable
#2096086 ·published 2011-12-23 22:56 UTC
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;
        }
    }
}