如何从内存中执行WPF程序集?

4
如果变量msMemoryStream类型并且包含一个 .Net 程序集,你通常会这样运行它:
var asm   = Assembly.Load(ms.ToArray());
var entry = asm.EntryPoint;
var inst  = asm.CreateInstance(entry.Name);
entry.Invoke(inst, null);

这在控制台应用程序和Windows窗体应用程序上运行良好,但是WPF应用程序会抛出异常:

Exception has been thrown by the target of an invocation.

在内部异常类型为System.IO.IOException的情况下:

Cannot locate resource 'mainwindow.xaml'.

堆栈跟踪非常大,但从开头猜测,当从内存加载时无法定位资源:

at MS.Internal.AppModel.ResourcePart.GetStreamCore(FileMode mode, FileAccess access)
at System.IO.Packaging.PackagePart.GetStream(FileMode mode, FileAccess access)
at System.IO.Packaging.PackagePart.GetStream()
at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
at System.Windows.Application.DoStartup()
at System.Windows.Application.<.ctor>b__1(Object unused)
[...]

我该如何修复这个问题?

如果由于Microsoft的实现需要加载资源文件,那么只有资源的临时exe文件是否可行?如果是这样,我如何动态创建一个并将MemoryStream中的程序集链接到它上面? - RoliSoft
2个回答

0
正如SAKryukov在codeproject 这里所建议的那样,我将WPF应用程序制作成一个带有自定义入口点的库,然后使用我的第二个应用程序调用它。问题似乎出在App.xaml实现starturi的方式上。

0
当您从MemoryStream动态加载程序集时,其工作目录将是您自己程序集的目录。该目录不太可能包含程序集所引用的XAML标记文件。
尝试将您的Environment.CurrentDirectory设置为一个包含所需XAML文件的新目录,至少在加载程序集和实例化类的过程中如此。

我尝试了这个,但问题仍然存在。然而,我预计它不会起作用,因为资源在MemoryStream中的程序集中,而不是在目录中。 - RoliSoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接