C#从字节数组启动另一个WPF程序[重复]

Posted

技术标签:

【中文标题】C#从字节数组启动另一个WPF程序[重复]【英文标题】:C# Launching another WPF program from a byte array [duplicate] 【发布时间】:2016-12-25 23:58:47 【问题描述】:

首先,让我说我已经查看了this,但我仍然无法找到解决我问题的好方法。 (我会在帖子中详细说明)

现在进入重点。 我有一个程序,我想通过登录来保护它。 我的设置如下:

Login.exe

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

用户应该登录,并在成功登录后,获取服务器文件(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.

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

【问题讨论】:

此异常抱怨Application 的第二个实例。您可能会尝试创建一个新域并将程序集加载到其中。你应该看看这里:Loading/Unloading assembly in different AppDomain 确实是一个很好的参考,但我可以问我如何能够手动添加字节数组,而不是将文件路径应用到 appdomainsetup,因为这似乎是不可能的据我所知? 创建一个中间程序集,其中包含一个具有接受字节数组的方法的类。此方法应从字节数组加载程序集。将此中间程序集加载到新域中。 【参考方案1】:

(我无法将其标记为完成,但这个问题现在已经解决了)

所以,经过一番挣扎,我终于设法让它工作了。

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

我在我的登录应用程序中获取了加载器类,并在登录成功授权后添加了其余部分:

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

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

之后它以某种方式起作用,我对此感到非常惊讶。但无论如何,感谢您的帮助并指出正确的主题!

【讨论】:

以上是关于C#从字节数组启动另一个WPF程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

大字节数组的 C# 程序性能 [重复]

无法将固定大小的字节数组从结构复制到 C# 结构中的另一个数组

从字节数组转换为字符串十六进制c# [重复]

如何将字节数组一个活动传递给另一个android [重复]

将 uint8 字节数组转换为任何 WPF 呈现对象

C# - 我可以使用数组初始化器从另一个字节数组中构建一个字节数组吗?