这个项目分为三块:
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中、单独将其做一个接口,但都不行,只要实例化还是会出错。无奈之下还要请教各位高手帮忙给予解答,解决一下这个棘手的问题,唯有及时送分感谢,在此先谢过!
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中、单独将其做一个接口,但都不行,只要实例化还是会出错。无奈之下还要请教各位高手帮忙给予解答,解决一下这个棘手的问题,唯有及时送分感谢,在此先谢过!
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”。
是通过注册表寻找组件 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);
}
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, "参数列表");
换成string strPath = "C:\\MessageInterface\\XYComponent\\bin\\Connection.dll";
试试,有时候用@来设置路径会有点小问题.