首页 新闻 赞助 找找看

关于动态加载dll产生的问题

0
悬赏园豆:100 [已关闭问题] 关闭于 2015-11-02 09:11

有两个dll A & B, A引用了B, 然后A & B 都是动态的被加载到一个windows service中, 然后我要对B中某个方法进行修改, 编译之后在windows service不重启的情况下把这个B给动态加载进去了,但是这个时候对A来说, 似乎它引用的一直是之前老的那个B,新的B根本不起作用, 这个问题应该如何解决呢. 以下是代码例子,

A dll 中代码如下,

public class Printer
{
    public void Print()
    {
        PrintUtility.Print();
    }
}

B dll 中代码如下,

public class PrintUtility
{
    public static void Print()
    {
        Console.Write("Print Test");
    }
}

动态加载调用的方法是这个: public static Assembly Load(byte[] rawAssembly);

这个时候无论我如何更改B中PrintUtility中Print输出的内容, 然后动态加载B到内存中, 最终在A dll中调用的Print输出的内容总是 Print Test.

SuperJoe的主页 SuperJoe | 初学一级 | 园豆:68
提问于:2013-05-30 16:36
< >
分享
所有回答(5)
0

因为a仅仅是引用了b,a&b加载后,a会保留b的副本,所以b改变了a也不会去读,可以这么理解,a&b都加载了,这时候把b关了,如果说a要时时刻刻“关注”b,那么关掉b后a就是报错。但事实上不会,因为a保留了b的副本。如果要解决这个问题,要不就把a&b同时重启,要不可以尝试让a动态引用b。可以参考http://blog.csdn.net/pansiom/article/details/568096/

WuRang | 园豆:1730 (小虾三级) | 2013-05-30 16:54

你的意思是不是动态调用B里面的方法, 这样的话改动太大了,不太合适.

支持(0) 反对(0) SuperJoe | 园豆:68 (初学一级) | 2013-05-31 09:31

@SuperJoe: 对,如果不想重启程序,动态调用是最好的,要不然我就没什么办法了,可以去msdn问问

支持(0) 反对(0) WuRang | 园豆:1730 (小虾三级) | 2013-05-31 09:38
0

难道不能重启WINDOWS服务?

五行缺木 | 园豆:386 (菜鸟二级) | 2013-05-30 17:03

目的就是不能重启,要动态加载.

支持(0) 反对(0) SuperJoe | 园豆:68 (初学一级) | 2013-05-31 09:25
0

a不要直接调用b的静态函数, 用依赖注入的方式, 动态加载b的时候将a拥有的b的引用替换为新的dll里的b

悟了 | 园豆:521 (小虾三级) | 2013-05-30 17:26

这个不太现实, B里面的都是一些工具类啥的. 而且真要那么做, 那改动起来还是很大.

支持(0) 反对(0) SuperJoe | 园豆:68 (初学一级) | 2013-05-31 09:27
0

重启WINDOWS服务

cs518800 | 园豆:343 (菜鸟二级) | 2013-05-30 17:54
0

修改后更改下B中的版本号,系统就会重新加载修改后的项目B。这个也是最简单的操作

Ha_lo-Man | 园豆:123 (初学一级) | 2013-05-31 11:30

无论是否修改B中的版本号,系统都会加载B, 我的问题是A引用的一直是老的B而不是新的B. 所以我觉得这个不可行, 不过还是尝试下看看.

支持(0) 反对(0) SuperJoe | 园豆:68 (初学一级) | 2013-05-31 14:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册