项目中用到一个COM组件(CertKitAx.dll),手动添加引用(VS中 引用->添加引用->COM)添加成功。
使用时代码:
using CERTKITAXLib;
......
......//这里调用的是dll里的类的成员方法
CERTKITAXLib.BlockHouseClass bhc = new CERTKITAXLib.BlockHouseClass();
bhc.CFCA_SelectUserCerts(false);由于项目特殊,需要把“手动添加引用”这步用代码实现,并实现上述调用代码。
急,请高手帮忙!!!

解决方案 »

  1.   

    反射吧.NET 4.0新增了动态语言
      

  2.   

    Assembly.Load("CertKitAx.dll").CreateInstance("命名空间.类名称");
    参考:
    反射 C#(Assembly.Load方法介绍)
      

  3.   

    net4以下困难点,需要使用反射   Type comType = Type.GetTypeFromProgID("xxxx.xx"); 
                    //Guid clsid=new Guid("com在注册表中的CLSID");
                    //Type comType = Type.GetTypeFromCLSID(clsid);
                    object comObj=Activator.CreateInstance(comType);
                    object result = comType.InvokeMember("方法名", System.Reflection.BindingFlags.InvokeMethod, null, comObj, new object[] { 方法参数 });
      

  4.   


    不行啊。按你这样写:
    Assembly.Load(Application.StartupPath + "\\CertKitAx.dll").CreateInstance("CERTKITAXLib.BlockHouseClass");
    报错了,未能加载文件或程序集或它的某一个依赖项。给定程序集名称或基本代码无效。 (异常来自 HRESULT:0x80131047)
      

  5.   

              Type t = Assembly.LoadFrom(path).GetType(objtype, true);
              obj ret = System.Activator.CreateInstance(t);
      

  6.   


    Assembly.LoadFrom(path)这一步就有问题,后面的都不用继续了。
      

  7.   

    这个先要生成"强命名程序集",然后才能在程序中引用,这个属于GAC方面的知识;
    你按我给的链接里面的步骤生成一个"强命名程序集"然后Assembly.Load("程序集名,Version=版本,culture=区域信息,PublicKeyToken=公钥")就行了...
      

  8.   

    LZ想的多了吧,在开发的时候还是使用正常的添加,只是在代码中增加COM组件是否已经注册的判断,如果没有注册COM组件,用代码时间COM组件的注册就可以了。
      

  9.   

    如果是C++或者VB的dll文件呢?好像不能用Assembly来操作吧。
      

  10.   


    C++或者VB的dll属于非托管代码,可以用工具转化成托管代码以后才可以操作;
      

  11.   

    (1) 首先生成  COM组件的 proxy dll,生成的方法可以调用 
        tlbimp.exe /out:文件名 /namespace:名字空间  /asmversion:版本戳(2) 然后 用 reflection 方式调用调用  proxy dll 里的类,方法。等按照这个思路就可以实现了,手头上有一个工具就按照这种方式做的,可以测试任意一个com组件的方法。