我编写了一个dll,包含一个class A,在另外一个工程中引用了这个dll,并使用了这个class,运行时正常,代码大概如下
A a=new A();
然后我再利用Assembly手动加载这个dll,
Assembly.LoadFrom("dll path");
A a =new A();
编译时由于引用了此dll,正常通过。
运行时我将此dll移动到指定路径,想通过Assembly加载,加载成功,不过运行创建A对象就出错。
这说明了手动加载的dll与自动加载的是有区别的,请问有没有人能解释一下他们的区别是什么?
还有,能不能手动加载后像自动加载的那样运行?应该怎么做?
谢谢各位~~~
A a=new A();
然后我再利用Assembly手动加载这个dll,
Assembly.LoadFrom("dll path");
A a =new A();
编译时由于引用了此dll,正常通过。
运行时我将此dll移动到指定路径,想通过Assembly加载,加载成功,不过运行创建A对象就出错。
这说明了手动加载的dll与自动加载的是有区别的,请问有没有人能解释一下他们的区别是什么?
还有,能不能手动加载后像自动加载的那样运行?应该怎么做?
谢谢各位~~~
参看
http://blog.csdn.net/knight94/archive/2006/04/10/657527.aspx
各位高手,如果可以的话请针对这点进行分析一下,他们本质上的区别是什么呢?谢谢
A myA = new A();
这样使用,那么在编译的时候,可以通过加载的Assembly进行类型检查,从而进行类型绑定。后者呢,是在运行时进行加载,那么程序在编译的时候,Assembly并没有进行加载,因此类型也变成未知,从而无法类型绑定,所以会出现编译错误;所以此时需要通过反射进行操作。
首先谢谢你的回答。
我清楚A myA = new A()是需要编译是类型确定的,所以我在编译时加上了dll引用,为的就是绕过这个问题。
现在又两种加载dll方式:
1、运行时调用A myA = new A();此时会自动加载dll到内存中,而如果没有运行这语句dll是不会自动加载的。
2、用Assembly加载。
我分别使用两种方法加载了dll比较了他们的名称,并没有任何不同,它们都是这个dll在内存中的镜像,但是使用第二种方法加载后,调用A myA = new A();就会出错,这里说明了两者在内存中实际是不同的。
我想了解清楚,为什么会有这个不同呢?它们之间本质区别在哪里呢?
先谢谢各位的再次回答,可能的话请针对此问题继续讨论,在此敬礼!
Assembly asm1 = Assembly.Load("a.dll")
asm != asm1
dll自动加载只在第一次调用此dll是发生,那么它应该有一个校验机制,判断是否加载了此dll,那么我手动加载了dll后向此校验机制注册应该就可以完成以后运行A myA=new A();无需再次加载吧?当然这种只是异想天开。
按照你的说法应该是运行时加载的dll程序并不知道,所以又再次加载了导致应用不同是吗?
有没有什么办法可以让这个dll手动加载后能够让应用程序识别而能直接运行A myA=new A();呢?谢谢各位继续回答~~~~
而动态加载:是在需要使用dll的时候去加载,通过反射机制实现。其变量类型也是在使用的时候才确定。