我编写了一个dll,包含一个class A,在另外一个工程中引用了这个dll,并使用了这个class,运行时正常,代码大概如下
A a=new A();
然后我再利用Assembly手动加载这个dll,
Assembly.LoadFrom("dll path");
A a =new A();
编译时由于引用了此dll,正常通过。
运行时我将此dll移动到指定路径,想通过Assembly加载,加载成功,不过运行创建A对象就出错。
这说明了手动加载的dll与自动加载的是有区别的,请问有没有人能解释一下他们的区别是什么?
还有,能不能手动加载后像自动加载的那样运行?应该怎么做?
谢谢各位~~~

解决方案 »

  1.   

    区分动态加载后,无法像添加引用那么直接使用,需要通过获得type,然后在进行创建对象,
    参看
    http://blog.csdn.net/knight94/archive/2006/04/10/657527.aspx
      

  2.   

    这些我知道,我想知道的不是使用上的区别,我找了内存中加载的dll,两种加载方式都把dll加载到内存,而且证据相同,我找不出他们的区别,可是为什么第二种情况就会出错呢?
    各位高手,如果可以的话请针对这点进行分析一下,他们本质上的区别是什么呢?谢谢
      

  3.   

    to 各位高手,如果可以的话请针对这点进行分析一下,他们本质上的区别是什么呢?谢谢那你是否理解静态加载和动态加载的区别呢前者是在编译之前进行加载,类型变为已知,因此可以类似于
    A myA = new A();
    这样使用,那么在编译的时候,可以通过加载的Assembly进行类型检查,从而进行类型绑定。后者呢,是在运行时进行加载,那么程序在编译的时候,Assembly并没有进行加载,因此类型也变成未知,从而无法类型绑定,所以会出现编译错误;所以此时需要通过反射进行操作。
      

  4.   

    to Knight94(愚翁):
    首先谢谢你的回答。
    我清楚A myA = new A()是需要编译是类型确定的,所以我在编译时加上了dll引用,为的就是绕过这个问题。
    现在又两种加载dll方式:
    1、运行时调用A myA = new A();此时会自动加载dll到内存中,而如果没有运行这语句dll是不会自动加载的。
    2、用Assembly加载。
    我分别使用两种方法加载了dll比较了他们的名称,并没有任何不同,它们都是这个dll在内存中的镜像,但是使用第二种方法加载后,调用A myA = new A();就会出错,这里说明了两者在内存中实际是不同的。
    我想了解清楚,为什么会有这个不同呢?它们之间本质区别在哪里呢?
    先谢谢各位的再次回答,可能的话请针对此问题继续讨论,在此敬礼!
      

  5.   

    Assembly asm = Assembly.Load("a.dll")
    Assembly asm1 = Assembly.Load("a.dll")
    asm != asm1 
      

  6.   

    to hdt(倦怠):
    dll自动加载只在第一次调用此dll是发生,那么它应该有一个校验机制,判断是否加载了此dll,那么我手动加载了dll后向此校验机制注册应该就可以完成以后运行A myA=new A();无需再次加载吧?当然这种只是异想天开。
    按照你的说法应该是运行时加载的dll程序并不知道,所以又再次加载了导致应用不同是吗?
    有没有什么办法可以让这个dll手动加载后能够让应用程序识别而能直接运行A myA=new A();呢?谢谢各位继续回答~~~~
      

  7.   

    to 有没有什么办法可以让这个dll手动加载后能够让应用程序识别而能直接运行A myA=new A();呢?如果是动态加载Assembly的话,是不能。
      

  8.   

    to 按照你的说法应该是运行时加载的dll程序并不知道,所以又再次加载了导致应用不同是吗?内存中有可能共享,但不意味着程序中两个assembly能合并。
      

  9.   

    可以简单的理解为:手动添加:可理解为静态声明,编译器或设计工具直接知道具体的类型.
    而动态加载:是在需要使用dll的时候去加载,通过反射机制实现。其变量类型也是在使用的时候才确定。