2010-09-29 28 views
4

如果ms变量是MemoryStream,并包含一个.NET程序集,你通常会这样运行:如何从内存执行WPF程序集?

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

我怎么能解决这个问题?

+0

如果由于Microsoft的实施,它需要一个文件来加载资源,临时exe文件是否可以工作,只有资源?如果是这样,我该如何创建一个并将MemoryStream中的程序集链接到它? – RoliSoft 2010-09-29 18:59:57

回答

0

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

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

+0

我试过了,但问题仍然存在。但是,我期望它不起作用,因为资源在MemoryStream中的组合件中,而不在目录中。 – RoliSoft 2010-09-29 18:58:05

0

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