这个项目分为三块:
A. 客户端(HTTP方式与服务端进行交互)
B. 服务器端(用Socket套接字与模拟器进行交互)
C. 模拟器端(用Socket套接字接受服务器端数据并模拟数据库返回给服务器数据信息)   “B. 服务端”与“C. 模拟器端”交互时需要调用一个Connection组件(此组件为一个COM+组件)之前是直接将Connection.dll组件添加到服务端项目引用中去直接引用实例化类的,但是现在由于需要将“B. 服务端”中的组件全部分离出来放入到其他盘符中的文件夹去,于是之前直接添加引用的方式现在无法使用,只能用反射来调用,可这就遇到了一个让人头痛的问题,COM组件反射调用十分正常就是唯一的这个名为Connection.dll的COM+组件始终反射调用不成功。
具体反射调用如下:
//现在Connection.dll存放的路径,之前是在服务器端项目中的BIN目录下
string strPath = @"C:\MessageInterface\XYComponent\bin\Connection.dll";
Assembly oAssem = Assembly.Load(AssemblyName.GetAssemblyName(strPath));
Type oType = oAssem.GetType("LZ.Workflow.Server.Connection.CSConnection");
Object oConnection = Activator.CreateInstance(oType);//就在此处报错,上面三句都是正常赋值的
……
//下面是原程序中实例化类的方式
//命名空间:LZ.Workflow.Server.Connection
//类名:CSConnection
//LZ.Workflow.Server.Connection.CSConnection oConnection;
//oConnection = new LZ.Workflow.Server.Connection.CSConnection();
    报错不是说“该位置没有此文件”,就是实例化类对象为空值,不知道是不是COM+组件无法反射调用还是其它什么原因,在网上也找了很多的解决方法,包括将此COM+组件注册到GAC中、单独将其做一个接口,但都不行,只要实例化还是会出错。无奈之下还要请教各位高手帮忙给予解答,解决一下这个棘手的问题,唯有及时送分感谢,在此先谢过!

解决方案 »

  1.   

    补充一下,如若还是按原来的代码那样写,即:
    LZ.Workflow.Server.Connection.CSConnection oConnection; 
    oConnection = new LZ.Workflow.Server.Connection.CSConnection();
    则把BIN目录下的所有DLL组件拷贝到其它路径目录下并由“A. 客户端”调用的时候就会报错为
    "捕捉到RemotingException异常"
    无法加载类型"LZ.Workflow.Server.Connection.CSConnection,CSConnection, Version=2.1.0.1, Culture=neutral, PublicKeyToken=37d6a58bcf1049h7”。
      

  2.   

    生成的 interop dll 跟组件 dll 在位置上没有任何关系,
    是通过注册表寻找组件 dll 的interop dll 中就是借助 com interop service 来反射调用组件的IDispatch 派上用场,对于小的 com 组件(接口简单, 数据类型简单) 可以自己写那个 interop 层.比如:    protected override void create()
        {
          //if (!OfficeFactory.ExcelInstalled)
          //  throw new NotSupportedException("请先安装 Microsoft Excel");
          comObject = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
          wrapperType = comObject.GetType();
        }
        public ExcelWorkbooks Workbooks
        {
          get
          {
            if (null == _workbooks)
              _workbooks = new ExcelWorkbooks(getProperty("Workbooks"));
            return _workbooks;
          }
        }
        protected object getProperty(string propertyName)
        {
          return wrapperType.InvokeMember(propertyName, System.Reflection.BindingFlags.GetProperty, null, comObject, null);
        }
      

  3.   

    请尝试下面的方法:
    object typeConnection = Type.GetTypeFromProgID("你这个COM组件的PID");
    //object typeConnection = Type.GetTypeFromCLSID("你这个COM组件的CLSID");
    object oConnection = Activator.CreateInstance(typeConnection);
    typeConnection.InvokeMember("COM的方法名",BindingFlags.Default | BindingFlags.InvokeMethod, null, oConnection, "参数列表");
      

  4.   

    你把string strPath = @"C:\MessageInterface\XYComponent\bin\Connection.dll"; 
    换成string strPath = "C:\\MessageInterface\\XYComponent\\bin\\Connection.dll"; 
    试试,有时候用@来设置路径会有点小问题.