using System;
|
using System.IO;
|
using System.Reflection;
|
|
namespace PdmSwPlugin.Common
|
{
|
public class RemoteLoader : MarshalByRefObject
|
{
|
private Assembly _assembly;
|
|
public void LoadAssembly(string assemblyFile)
|
{
|
_assembly = Assembly.LoadFrom(assemblyFile);
|
}
|
public dynamic GetInstance(string typeName)
|
{
|
if (_assembly == null) return null;
|
var type = _assembly.GetType(typeName);
|
var obj = Activator.CreateInstance(type);
|
return obj;
|
}
|
public object ExecuteMothod(string typeName, string methodName, object[] parameters)
|
{
|
if (_assembly == null) return null;
|
var type = _assembly.GetType(typeName);
|
var obj = Activator.CreateInstance(type);
|
// return obj;
|
MethodInfo method = type.GetMethod(methodName);
|
return method.Invoke(obj, parameters);
|
}
|
}
|
|
public class PluginLoader
|
{
|
public AppDomain appDomain { get; set; }
|
public RemoteLoader remoteLoader { get; set; }
|
public PluginLoader(string pluginName)
|
{
|
AppDomainSetup setup = new AppDomainSetup();
|
setup.ApplicationName = "plugin_" + pluginName;
|
setup.ApplicationBase = "C:\\Users\\cheng\\Documents\\Workspace\\PdmSwPlugin.MaterialSelect\\bin\\Debug";// "C:\\Users\\cheng\\Documents\\Workspace\\PdmSw\\bin\\x64\\Debug";
|
setup.ConfigurationFile = "C:\\Users\\cheng\\Documents\\Workspace\\PdmSw\\bin\\x64\\Debug\\PdmSwPlugin.Main.dll.config";
|
|
//"C:\\Users\\cheng\\Documents\\Workspace\\WpfUI\\bin\\x64\\Debug\\WpfUI.exe.config";
|
setup.CachePath = setup.ApplicationBase;
|
//setup.ShadowCopyFiles = "true";
|
//setup.ShadowCopyDirectories = setup.ApplicationBase;
|
setup.PrivateBinPath = "C:\\Users\\cheng\\Documents\\Workspace\\PdmSwPlugin.MaterialSelect\\bin\\Debug"; // AppDomain.CurrentDomain.BaseDirectory;
|
// setup.DynamicBase = "C:\\Work\\dll\\dll"; // AppDomain.CurrentDomain.BaseDirectory;
|
appDomain = AppDomain.CreateDomain("plugin_" + pluginName, null, setup);
|
|
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
|
|
string name = Assembly.GetAssembly(typeof(RemoteLoader)).GetName().FullName;
|
string className = typeof(RemoteLoader).FullName;
|
object sb = appDomain.CreateInstanceAndUnwrap(name, className);
|
remoteLoader = (RemoteLoader)sb;
|
//appDomain.Load("C:\\Users\\cheng\\Documents\\Workspace\\PdmSwPlugin.MaterialSelect\\bin\\Debug\\PdmSwPlugin.MaterialSelect.dll");
|
remoteLoader.LoadAssembly("C:\\Users\\cheng\\Documents\\Workspace\\PdmSwPlugin.MaterialSelect\\bin\\Debug\\PdmSwPlugin.MaterialSelect.dll");
|
}
|
|
public Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
|
{
|
try
|
{
|
Assembly assembly = System.Reflection.Assembly.Load(args.Name);
|
if (assembly != null) return assembly;
|
}
|
catch
|
{ // ignore load error
|
}
|
|
// *** Try to load by filename - split out the filename of the full assembly name
|
// *** and append the base path of the original assembly (ie. look in the same dir)
|
// *** NOTE: this doesn't account for special search paths but then that never
|
// worked before either.
|
string[] Parts = args.Name.Split(',');
|
string File = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + Parts[0].Trim() + ".dll";
|
return System.Reflection.Assembly.LoadFrom(File);
|
}
|
/// <summary>
|
/// 加载程序集
|
/// </summary>
|
/// <param name="assemblyFile"></param>
|
public void LoadAssembly(string assemblyFile)
|
{
|
remoteLoader.LoadAssembly(assemblyFile);
|
}
|
/// <summary>
|
/// 创建对象实例
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="typeName"></param>
|
/// <returns></returns>
|
public dynamic GetInstance(string typeName)
|
{
|
if (remoteLoader == null) return null;
|
return remoteLoader.GetInstance(typeName);
|
}
|
/// <summary>
|
/// 执行类型方法
|
/// </summary>
|
/// <param name="typeName"></param>
|
/// <param name="methodName"></param>
|
/// <returns></returns>
|
public object ExecuteMothod(string typeName, string methodName, object[] parameters)
|
{
|
return remoteLoader.ExecuteMothod(typeName, methodName, parameters);
|
}
|
/// <summary>
|
/// 卸载应用程序域
|
/// </summary>
|
public void Unload()
|
{
|
try
|
{
|
if (appDomain == null) return;
|
AppDomain.Unload(appDomain);
|
appDomain = null;
|
remoteLoader = null;
|
}
|
catch (CannotUnloadAppDomainException ex)
|
{
|
throw ex;
|
}
|
}
|
public Assembly[] GetAssemblies()
|
{
|
AppDomain a = this.appDomain;
|
return a.GetAssemblies();
|
}
|
}
|
}
|