【问题标题】:How to execute WPF assembly from memory?如何从内存中执行 WPF 程序集?
【发布时间】:2011-04-18 22:04:38
【问题描述】:

如果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'.

stacktrace确实很大,但是从一开始就猜测,从内存加载时找不到资源:

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)
[...]

我该如何解决这个问题?

【问题讨论】:

  • 如果由于微软的实现它需要一个文件来加载资源,一个临时的exe文件是否可以工作,只有资源?如果是这样,我如何动态创建一个并将 MemoryStream 中的程序集链接到它?

标签: c# wpf reflection assemblies


【解决方案1】:

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

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

【讨论】:

  • 我试过这个,但问题仍然存在。但是,我希望它不起作用,因为资源位于 MemoryStream 的程序集中而不是目录中。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2012-06-20
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多