本帖最后由 s9969 于 2011-11-12 14:18:47 编辑

解决方案 »

  1.   

    因为这个dll 没有被CurrentDomain加载进来。你可以使用:AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap例如:
    object obj = AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("ClassAsm.dll", "NMFoo.CalcWithInterface");或者先用 Assembly.LoadFrom / LoadFile 加载
      

  2.   

    ------------------------------
    果然是的,谢谢大侠。
    另外小弟还有几点疑问请教下:
    (1)我尝试在解决方案里添加对ClassAsm.dll的引用,然后用CreateInstanceAndUnwrap()调用,结果没有成功,那么我想问下,“在解决方案里添加对ClassAsm.dll的引用”编译器做了什么?引用后的dll没有加载到程序域里吗?
    (2)对一个类型库(dll)中的类的调用,如果是早期绑定或者动态绑定的话,就要先在解决方案里添加对dll的引用,然后使用时用new实例化;而如果后期绑定的话,就是在使用时用一些Load()函数加载,再用CreateInstance()等函数实例化?是不是这个概念?
      

  3.   


    不会啊,如果已经添加了引用就可以直接 CreateInstanceFromAndUnwrap
    在程序启动后该assembly会被加载进来的。注意 CreateInstanceAndUnwrap 是Assembly的名字,是不带".dll"的。
    例:
    static void Main(string[] args)
    {
        dynamic test = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
        Console.WriteLine(test.Echo("hi"));    Console.Read();
    }另外如果是添加了引用了,可以直接用 System.Activator.CreateInstance
    具体查查MSDN吧(2) 是这样的。不管是new还是反射都要保证该dll被加载当前的Domain里。