WPF Add-in 的一个大 BUG!!!!?

Intelement 2008-07-11 03:30:03
由于WPF先天的限制,没有办法将某个应用程序域(AppDomain)生成的WPF对象传递到另外一个应用程序域,
必须通过FrameworkElementAdapters的两个静态方法(ViewToContractAdapter和ContractToViewAdapter)。

当要将某个应用程序域生成的WPF对象传递到另外一个应用程序域之前,
需要把FrameworkElement类型的WPF对象转换为INativeHandleContract才能传递过去,
FrameworkElementAdapters.ViewToContractAdapter(FrameworkElement类型的对象)
另外一个应用程序在取到INativeHandleContract对象后,
需要把INativeHandleContract对象转换回FrameworkElement类型的对象后才能使用(进行显示)。
FrameworkElementAdapters.ContractToViewAdapter(INativeHandleContract类型的对象)
通过这种方法,可以解决在两个应用程序域之间传递WPF对象的问题。

具体的例子可以参照微软给出的两个例子。
例子1(英文)
How to: Create an Add-In That Returns a UI
http://msdn.microsoft.com/en-us/library/bb909849.aspx
例子2(英文)
How to: Create an Add-In That Is a UI
http://msdn.microsoft.com/en-us/library/bb909887.aspx

我按照上面给出的例子把程序做出来运行之后,咋看一下好像没有什么问题,
但是当我在不关闭应用程序的情况下不断的加载新的外接程序,
加载到一定的次数之后程序出现 【Exception from HRESULT: 0x88980406】异常。

我使用的环境如下:
Visual Studio Team System 2008 Version 9.0.21022.8 RTM
Windows Vista Ultimate with Service Pack 1

另,CLR Add-in Team 给出的例子也有问题。
http://blogs.msdn.com/clraddins/archive/2007/08/06/appdomain-isolated-wpf-add-ins-jesse-kaplan.aspx(例子说明)
http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=clraddins&ReleaseId=9454(.NET 3.5 源程序)
再现方法:不停的选择或取消某个外接程序对应的菜单选项以对外接程序进行加载或卸载。

感觉Add-in框架好像不是很稳定的样子……难道仅仅是因为我环境的问题?
...全文
1590 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
Teemo酱 2011-10-24
  • 打赏
  • 举报
回复
今天才路过···
Intelement 2008-08-19
  • 打赏
  • 举报
回复
CSDN 被封,今天才发现可以访问了,J动ing……
过来看看我的问题有没有发霉ed啊??
virusswb 2008-08-04
  • 打赏
  • 举报
回复
楼主好问题啊,我也正需要这方面资料呢,谢谢,答案出来别人贴出来,大家学习啊
ilovey4 2008-07-29
  • 打赏
  • 举报
回复
支持i个
HW_zxc_009 2008-07-25
  • 打赏
  • 举报
回复
up
youthgun 2008-07-21
  • 打赏
  • 举报
回复
路过学习一下,,收了点东西走人,,不过我也晕了!
hanyu0528 2008-07-18
  • 打赏
  • 举报
回复
好复杂
ermachao 2008-07-18
  • 打赏
  • 举报
回复
收下了,谢谢LZ
Intelement 2008-07-16
  • 打赏
  • 举报
回复
>我的需求有可能100ms要对UI的状态进行更新
100ms这个要求可能苛刻了点,至少1s那是肯定的了。
Intelement 2008-07-16
  • 打赏
  • 举报
回复
嗯……
倒是可以考虑考虑试一下你的方法……
呵呵

不过有几个问题想请教一下
1-UI和脚本位于不同的程序域,因此UI和脚本交互的成本就有点昂贵了吧
我的需求有可能100ms要对UI的状态进行更新
所以不能不考虑速度的因素
2-脚本文件中为什么有一个类从Window继承过来呢?
3-RoutedEvent不能跨域传递的,你是怎么通过名称关联UI和脚本的?

三克丝
Intelement 2008-07-15
  • 打赏
  • 举报
回复
顺便问一句
你在xaml定义的UI对象是使用XamlReader加载进当前的appdomain(default appdomain)吧?
脚本中定义的仅仅是UI所关联的事件吧?
天乐_那由他 2008-07-15
  • 打赏
  • 举报
回复
呵呵,这样我就帮不了你了……

前面已经说过,我的需求是:

动态编译脚本,动态加载Xaml,合二为一之后呈现窗体,此窗体上的UI显示由Xaml定义,UI的事件行为则由脚本定义。

在实现这个目标的路上,我没有“使用addin框架实现WPF UI加载和卸载功能”,所以,没有遭遇“使用addin框架重复多次加载卸载返回WPF UI的外接程序集会出现异常”。

楼主如果只是专注于“addin框架实现WPF UI加载和卸载功能时会出现内存泄漏”此项技术细节,希望确认或解决此bug而非前面所述的真实需求,

那么我是爱莫能助了。


Intelement 2008-07-15
  • 打赏
  • 举报
回复
我的问题不是动态编译、加载和卸载程序集的方法
而是为什么使用addin框架实现WPF UI加载和卸载功能时会出现内存泄漏
以及为什么使用addin框架重复多次加载卸载返回WPF UI的外接程序集会出现异常
天乐_那由他 2008-07-15
  • 打赏
  • 举报
回复
楼主,我仔细的思考了需求,从需求结合.NET现状,得出以下目标:

1、必须能够动态加载的那些东东(.cs和.xaml文件),动态编译运行;
2、必须能够及时卸载掉已无用的那些动态生成的程序集,即必须使用AppDomain封装动态编译生成的程序集;

于是我尝试使用AppDomain封装动态程序集,一开始发现即使Unload之后,程序集依然无法被卸载,
经过一夜思考、尝试,最终发现:

AppDomain.CreateInstanceAndUnwrap可在子程序域上创建一个对象,并返回其(代理)引用,如果在主程序域上对此返回对象使用反射技术,获取其类型信息,则该子程序域卸载时,仍会保留类型所在的程序集,导致卸载不完全。

嗯,就是这原因导致的无法卸载!
于是,改用接口,不再反射这个动态程序集里面的类型信息,一切OK!经测试,可以正常卸载那些动态程序集了。

顺便告诉楼主,我没有使用你提到的Add-in框架,甚至还没有去了解这是个什么东东……我使用了自己的方式,达到了1,2的目的。
天乐_那由他 2008-07-15
  • 打赏
  • 举报
回复
顺便确认你的问题,xaml文件是纯UI定义,不含一行代码,若有,也无视,使用时,用XamlReader加载。

脚本文件是cs源码,其中有一个类继承了Window,它里面定义了控件的事件,当然,因为使用的cs编译引擎,
所以,事件里可以做任何c#能做的事。

UI和源码之间的控件,通过名称来绑定。
天乐_那由他 2008-07-15
  • 打赏
  • 举报
回复
所谓的WPF UI,不过是一份xaml文件罢了,在主程序域加载也好,在子程序域加载也好……

若要从主程序域穿进去,那就当它是个字符串好了,何必一定要当它是个UI对象呢?

如果你不执着于必须传送WPF UI对象,那么,可以考虑这个思路。


当然,我并清楚你的需求是否要求一定要按你说的那样:必须传个UI对象进去。

试想,WPF的UI对象只能隶属于一个逻辑父对象,既然要传给子程序域,显然这个玩意儿就是子程序域的了,

主程序域何不早点放手,干脆传都不传,或者只传个xaml字符串/流等,这样,你就发现问题只剩下如何动态加载/卸载程序集了。

楼主的钻研精神值得学习,在此向楼主表示钦佩。
li45214521 2008-07-14
  • 打赏
  • 举报
回复
public void SetData(
string name,
Object data
)
是用于跨应用程序域访问
WPf 的确不像Window Forms 那么好用
但已经很好用了

Intelement 2008-07-14
  • 打赏
  • 举报
回复
安装“.NET 3.5 SP1 Beta”试了一下

太阳照样升起
黑夜依旧降临

我提到的问题还是一个都没有少

唯一不一样的是
“回复太快!如果你是恶意刷楼,将会受到严厉惩罚!”
“你有权保持沉默!你的帖子将作为呈堂证供!”

……

另,上面一段代码改为如下:

string source = @"
namespace Sample
{
public class Demo
{
public Demo()
{
System.Console.WriteLine(""an instance of Sample.Demo created."");
}
}
}
";

bwangel 2008-07-14
  • 打赏
  • 举报
回复
WPF有前途吗, 如果客户用这个东西, 下载.net3.5都要170多M.
Intelement 2008-07-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 greenery 的回复:]
wpf好像并不是太好用的样子。。。
[/Quote]
是啊,感觉还不是很成熟稳定……
加载更多回复(26)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧