//
//
//
//
// $Revision: 3746 $
//
using System;
using System.Globalization;
using System.Reflection;
namespace ICSharpCode.Core
{
///
/// Because AddIn assemblies are loaded into the LoadFrom context, creating AppDomains in them that
/// use an arbitrary ApplicationBase path does not work correctly.
/// This class contains a static method that helps launching a static method on a type in a new AppDomain.
///
///
///
/// public static class CurrentClass { // is NOT MarshalByRef
/// public static ResultClass[] GetResults()
/// {
/// AppDomainSetup setup = new AppDomainSetup();
/// setup.ApplicationBase = myApplicationBase;
/// AppDomain domain = AppDomain.CreateDomain("Display name for domain", AppDomain.CurrentDomain.Evidence, setup);
/// try {
/// return (ResultClass[])AppDomainLaunchHelper.LaunchInAppDomain(domain, typeof(CurrentClass), "GetResultsDirectly", requestObject);
/// } finally {
/// AppDomain.Unload(domain);
/// }
/// }
/// public static ResultClass[] GetResultsDirectly(Request requestObject) { ... }
/// }
/// [Serializable] class Request { ... } // must be serializable !!!
/// [Serializable] class ResultClass { ... } // must be serializable !!!
///
[Obsolete("This class is broken, serialization does not work and addin dependencies are not loaded in the AppDomain")]
public class AppDomainLaunchHelper : MarshalByRefObject
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")]
object LaunchMethod(string assemblyFile, string typeName, string methodName, object[] arguments)
{
Type t = Assembly.LoadFrom(assemblyFile).GetType(typeName);
return t.InvokeMember(methodName, (BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod), null, null, arguments, CultureInfo.InvariantCulture);
}
public static object LaunchInAppDomain(AppDomain domain, Type type, string methodName, params object[] arguments)
{
AppDomainLaunchHelper h = (AppDomainLaunchHelper)domain.CreateInstanceFromAndUnwrap(typeof(AppDomainLaunchHelper).Assembly.Location, typeof(AppDomainLaunchHelper).FullName);
return h.LaunchMethod(type.Assembly.Location, type.FullName, methodName, arguments);
}
}
}