Как выполнить сборку WPF из памяти? - PullRequest
4 голосов
/ 29 сентября 2010

Если переменная ms является MemoryStream и содержит сборку .Net, вы обычно запускаете ее следующим образом:

var asm   = Assembly.Load(ms.ToArray());
var entry = asm.EntryPoint;
var inst  = asm.CreateInstance(entry.Name);
entry.Invoke(inst, null);

Это хорошо работает в консольных приложениях и приложениях Windows Form, однакоПриложения 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 голосов
/ 02 мая 2011

В соответствии с предложением С.А.Крюкова о проекте кода здесь я превратил приложение WPF в библиотеку с настраиваемой точкой входа, которую затем вызывал в своем втором приложении. Проблема, похоже, заключается в том, как App.xaml реализует starturi

0 голосов
/ 29 сентября 2010

Когда вы динамически загружаете сборку из MemoryStream, ее рабочий каталог будет каталогом вашей собственной сборки. Этот каталог вряд ли будет содержать файлы разметки XAML, на которые ссылается сборка.

Попробуйте установить свой Environment.CurrentDirectory в новый каталог, содержащий необходимый XAML, по крайней мере на время загрузки сборки и создания экземпляра класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...