110,530
社区成员
发帖
与我相关
我的任务
分享
//跨应用程序边界访问代理
public class ProxyObject : MarshalByRefObject
{
Assembly assembly = null;
private Type type;
public void Load(string AssemblyFile, string fullClassName)
{
assembly = Assembly.LoadFile(AssemblyFile);
type = assembly.GetType(fullClassName);
}
public void Play(Grid Container)
{
MethodInfo method = type.GetMethod("Play");
if (method == null) return;
Object obj = Activator.CreateInstance(type);
var pg = (UserControl)method.Invoke(obj, new object[] { Container });
Container.Children.Add(pg);
}
}
private AppDomain ad;
//呈现子程序视图
private void LoadChildPage()
{
string callingDomainName = AppDomain.CurrentDomain.FriendlyName;
ad = AppDomain.CreateDomain("DLL Unload test");
ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"Launcher.exe", "Launcher.ProxyObject");
obj.Load("Test.dll", "Test.HelloWorld");
obj.Play(this.PageContainer); //此处PageContainer是Grid,将无法传递
}
//卸载子程序视图
private void CloseChildPage()
{
AppDomain.Unload(ad);
}
StreamResourceInfo sriDLL = Application.GetResourceStream( dll路径);
AssemblyPart assemblyPart = new AssemblyPart();
Assembly assembly = assemblyPart.Load(sriDLL.Stream);
UserControl uc = (UserControl)assembly.CreateInstance(dll中userControl名称);
grid.Children.Add(uc);
大概就是这个逻辑。