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程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章