C#从字节数组中启动另一个WPF程序

时间:2016-12-25 23:58:48

标签: c# arrays wpf .net-assembly appdomain

首先,让我说我已经浏览了this,我仍然无法找到解决问题的绝佳方法。 (我将在帖子中详细说明)

现在到了这一点。 我有一个程序,我想通过登录安全。 我的设置如下:

LOGIN.EXE

Application.exe (从服务器收集到byte [])

用户应该登录,并且在成功登录后,获取服务器文件(Application.exe)并运行它,但是此文件必须本地存储在用户计算机上。相反,此文件存储为字节数组,应作为程序启动,但如果可能,则不应在硬盘驱动器上启用。

以下是用户如何看到它:

  • 首先,他们获得登录应用程序,登录和应用程序 将从服务器下载文件,并执行它。

现在我遇到的主要问题是,每当我加载这个字节数组时,我都会遇到以下异常:

System.Reflection.TargetInvocationException: The destination of an activation triggered an exception. ---> System.InvalidOperationException: Can not create more than one instance of System.Windows.Application in the same AppDomain.

我尝试过多种方式,但我总是最终得到以下代码:

Assembly a = Assembly.Load(tmpbytearray);
MethodInfo method = a.EntryPoint;
if (method != null)
{
    object o = a.CreateInstance(method.Name);
    method.Invoke(o, null);
}

我也试过

Assembly assembly = Assembly.Load(tmpsrc);
//entrypoint: MyMainApplication.App.Main
Type type = assembly.GetType("MyMainApplication.App");
var obj = Activator.CreateInstance(type);
type.InvokeMember("Main",
    BindingFlags.Default | BindingFlags.InvokeMethod,
    null,
    obj,
    null);

但仍然坚持相同的例外。

当我从顶部阅读reference(B部分和C部分)时,我也看到了CreateInstanceFromAndUnwrap的用法,但我找不到办法为它提供一个字节数组,而不是文件路径,我决定不这样做。 现在我回到原点,因此我最后希望总结这个项目的解决方案。

如果我在整个帖子中犯了一些误解,请随意提问,因为我会尽力使其尽可能清晰易懂。

提前致谢!

更新(可能另一种方法) 我现在想到制作一个基于控制台的小型应用程序,它将作为一个发射器"对于这个应用程序然而,这也是一个例外:

System.Reflection.TargetInvocationException: The destination of an activation triggered an exception. ---> System.IO.IOException: The resource mainwindow.xaml was not found.

这个异常非常奇怪,因为应用程序本身在运行时可以正常工作。以下是:

Assembly a = Assembly.Load(tmpsrc);
MethodInfo method = a.EntryPoint;
if (method != null)
{
    object o = a.CreateInstance(method.Name);
    method.Invoke(o, null); //Exception.
}

根据可能最简单的解决方案,您更喜欢什么,以及您如何看待任何方法的可能解决方案(第二种方法或第一种方法)?

1 个答案:

答案 0 :(得分:0)

(我不能将此标记为完整,但此问题现已解决)

所以,有些人在以后挣扎,我终于成功了。

我最终尝试了很多东西,但我的解决方案基于this问题。

我在登录应用程序中使用了loader类,并在成功授权登录后添加了其余类:

var domain = AppDomain.CreateDomain("test");
domain.Load("Login");

var loader = (Loader)domain.CreateInstanceAndUnwrap("Login", "Login.Loader");
loader.Load(tmpsrc);

之后它以某种方式起作用,我感到非常惊讶。但无论如何,感谢帮助和精确指向正确的科目!