有两个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.
因为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/
你的意思是不是动态调用B里面的方法, 这样的话改动太大了,不太合适.
@SuperJoe: 对,如果不想重启程序,动态调用是最好的,要不然我就没什么办法了,可以去msdn问问
难道不能重启WINDOWS服务?
目的就是不能重启,要动态加载.
a不要直接调用b的静态函数, 用依赖注入的方式, 动态加载b的时候将a拥有的b的引用替换为新的dll里的b
这个不太现实, B里面的都是一些工具类啥的. 而且真要那么做, 那改动起来还是很大.
重启WINDOWS服务
修改后更改下B中的版本号,系统就会重新加载修改后的项目B。这个也是最简单的操作
无论是否修改B中的版本号,系统都会加载B, 我的问题是A引用的一直是老的B而不是新的B. 所以我觉得这个不可行, 不过还是尝试下看看.