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

时间:2010-09-29 16:05:37

标签: c# wpf reflection assemblies

如果ms变量是MemoryStream且包含.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)
[...]

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

从MemoryStream动态加载程序集时,其工作目录将是您自己的程序集的工作目录。该目录不太可能包含程序集引用的XAML标记文件。

尝试将Environment.CurrentDirectory设置为包含必要XAML的新目录,至少在程序集加载和类实例化期间。

答案 1 :(得分:0)

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