silverlight 4,动态加载xap模块

silverlight 4,动态加载xap模块,第1张

概述我知道可以使用Prism或MEF框架动态加载xap模块.但是,我不想使用这些框架;而是手动加载我的xap文件.所以,我创建了以下类(改编自互联网): public class XapLoader{ public event XapLoadedEventHandler Completed; private string _xapName; public XapLoade 我知道可以使用Prism或MEF框架动态加载xap模块.但是,我不想使用这些框架;而是手动加载我的xap文件.所以,我创建了以下类(改编自互联网): @H_403_7@

@H_403_7@

public class XapLoader{    public event XapLoadedEventHandler Completed;    private string _xapname;    public XapLoader(string xapname)    {        if (string.IsNullOrWhiteSpace(xapname))            throw new ArgumentException("InvalID module name!");        else            _xapname = xapname;    }    public voID Begin()    {        Uri uri = new Uri(_xapname,UriKind.relative);        if (uri != null)        {            WebClIEnt wc = new WebClIEnt();            wc.OpenReadCompleted += onXapLoadingResponse;            wc.OpenReadAsync(uri);        }    }    private voID onXapLoadingResponse(object sender,OpenReadCompletedEventArgs e)    {        if ((e.Error == null) && (e.Cancelled == false))            initXap(e.Result);        if (Completed != null)        {            XapLoadedEventArgs args = new XapLoadedEventArgs();            args.Error = e.Error;            args.Cancelled = e.Cancelled;            Completed(this,args);        }    }    private voID initXap(Stream stream)    {        string appManifest = new StreamReader(Application.GetResourceStream(        new StreamResourceInfo(stream,null),new Uri("AppManifest.xaml",UriKind.relative)).Stream).ReadToEnd();        XElement deploy = Xdocument.Parse(appManifest).Root;        List<XElement> parts = (from assemblyParts in deploy.Elements().Elements()                                select assemblyParts).ToList();        foreach (XElement xe in parts)        {            string source = xe.Attribute("Source").Value;            AssemblyPart asmPart = new AssemblyPart();            StreamResourceInfo streamInfo = Application.GetResourceStream(                 new StreamResourceInfo(stream,"application/binary"),new Uri(source,UriKind.relative));            asmPart.Load(streamInfo.Stream);        }    }}public delegate voID XapLoadedEventHandler(object sender,XapLoadedEventArgs e);public class XapLoadedEventArgs : EventArgs{    public Exception Error { get; set; }    public bool Cancelled { get; set; }}
@H_403_7@上面的代码工作正常;我可以通过以下方式加载任何xap:

@H_403_7@

XapLoader xapLoader = new XapLoader("Sales.xap");xapLoader.Completed += new XapLoadedEventHandler(xapLoader_Completed);xapLoader.Begin();
@H_403_7@现在,我在Sales.xap项目中有一个名为InvoiceVIEw的UserControl,所以我想实例化该类.在当前项目(Main.xap)中,我添加了对Sales.xap项目的引用,但是,因为我手动加载它,所以设置“copy Local = False”.但是在执行时,以下代码抛出TypeLoadException:

@H_403_7@

Sales.InvoiceVIEw vIEw = new Sales.InvoiceVIEw();
@H_403_7@似乎代码找不到InvoiceVIEw类.但我检查了XapLoader的initXap()方法是否成功执行.那么为什么代码找不到InvoiceVIEw类呢?有人可以帮我解决这个问题吗?

解决方法 这是基于提问者在下面的自我回答,而不是问题. @H_403_7@

@H_403_7@如果删除项目/模块,输出DLL / XAP文件会挂起.如果单击“显示所有文件”按钮,您将在相关项目的clIEntbin,bin和obj文件夹中看到一些这些遗留输出文件.

@H_403_7@您可以从项目中单独删除它们,或者,如果有疑问,搜索所有BIN和OBJ(例如使用桌面浏览器)并删除所有这些文件夹.将在需要时重新创建BIN / CLIENTBIN / OBJ文件夹(这是Visual Studio中“clean”选项应该完成的工作!)

@H_403_7@希望这可以帮助.

总结

以上是内存溢出为你收集整理的silverlight 4,动态加载xap模块全部内容,希望文章能够帮你解决silverlight 4,动态加载xap模块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1000995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存