这两天我尝试使用MEF动态加载silverlight,大体弄明白了是怎么一回事。
我是这样做的:
1、根据功能划分不同模块,建立多个silverlight class library工程,然后并不直接在silverlight application工程中直接引用,而是通过将各个silverlight class library工程编译成dll。
2、在服务端的Web工程中建立一个文件夹,将上面编译好的各个dll放入其中。
3、在silverlight application工程中的需要用到各个dll的页面中通过webclient从服务端下载相应dll,然后通过MEF动态装配。
用上述步骤我确实实现了动态加载silverlight的功能,但是伴随这也有一个问题。
问题如下:
假如我有一个silverlight class library名叫A,这是一个我需要在silverlight application中进行动态加载dll的一个对象,但是我还有一个silverlight class library名叫B,B并不是我需要动态加载的,但是在创建A的时候我引用了B,并使用了B中封装好的控件。这时如果我只下载A的dll的话,那么在装配A的过程中,A中所有用到B中控件的地方都会报错,指示找不到对应控件。
这就我所头痛的地方,我也曾想过解决办法,
1、将A的dll和B的dll打进一个包内,一起下载到silverlight本地客户端,接着解压包到bin下,然后在使用用流读取本地的A的dll并MEF动态加载A。这样貌似太过繁琐,而且不知道可行性整么样,我还没来的急试。
2、那只有在设计模块的时候注意了,比如说A的dll必须是功能独立的,不能再依赖其他的dll如B,这样在动态加载的时候我就只需要加载A但是这样貌似太难了。不过这样貌似在实际开发中太难了。
小弟才疏学浅,有些东西还没有太明白,可能有些问题在高手看来很幼稚,恳请原谅。还希望各位高手能多多帮忙,给点深入意见!
假如我有一个silverlight class library名叫A,这是一个我需要在silverlight application中进行动态加载dll的一个对象,但是我还有一个silverlight class library名叫B,B并不是我需要动态加载的,但是在创建A的时候我引用了B,并使用了B中封装好的控件。这时如果我只下载A的dll的话,那么在装配A的过程中,A中所有用到B中控件的地方都会报错,指示找不到对应控件。
在A exception的时候try catch 一下,然后判断加载需要的dependency不就可以了吗?
或者将B做成一个公共类库,默认下载。比如说ABC三个页面都用到B1,就在打开ABC的时候先下载B1,DEF用到B2,就下载B2。 之类的。