c#调用com的问题,请教

问题描述

各位:厂家提供了一个dll,需要用regsvr32先注册,然后再调用。我按照说明,先用regsvr32注册了dll,用VB的话调用没有问题,但用c#调用就报异常。具体如下:接口方法说明:1、Login(网络服务器,数据库名字,admin的密码,返回的错误信息)作用:登陆系统,调用其它方法前必须先调用它返回值:0-成功,1-密码不正确,2-人员不存在VB代码(测试通过):Subtest()DimobjAsObjectDimsErrAsStringSetobj=CreateObject("OperatorManager.OperManager",sErr)s=obj.Login("127.0.0.1","test2","admin",sErr)MsgBoxsMsgBoxsErrSetobj=NothingEndSub

c#代码(报异常):运行到oType.InvokeMember("Login",System.Reflection.BindingFlags.InvokeMethod,null,o,parts);时报异常"调用的目标发生了异常"System.TypeoType=System.Type.GetTypeFromProgID("OperatorManager.OperManager");objecto=System.Activator.CreateInstance(oType);string[]parts=newstring[4];parts[0]="127.0.0.1";parts[1]="test2";parts[2]="admin";oType.InvokeMember("Login",System.Reflection.BindingFlags.InvokeMethod,null,o,parts);MessageBox.Show(parts[3]);

异常详细信息为:未处理System.Reflection.TargetInvocationExceptionMessage=调用的目标发生了异常。Source=mscorlibStackTrace:在System.RuntimeType.InvokeDispMethod(Stringname,BindingFlagsinvokeAttr,Objecttarget,Object[]args,Boolean[]byrefModifiers,Int32culture,String[]namedParameters)在System.RuntimeType.InvokeMember(Stringname,BindingFlagsbindingFlags,Binderbinder,Objecttarget,Object[]providedArgs,ParameterModifier[]modifiers,CultureInfoculture,String[]namedParams)在System.Type.InvokeMember(Stringname,BindingFlagsinvokeAttr,Binderbinder,Objecttarget,Object[]args)在TestService.Form3.button1_Click(Objectsender,EventArgse)位置E:TestServiceForm3.cs:行号62在System.Windows.Forms.Control.OnClick(EventArgse)在System.Windows.Forms.Button.OnClick(EventArgse)在System.Windows.Forms.Button.OnMouseUp(MouseEventArgsmevent)在System.Windows.Forms.Control.WmMouseUp(Message&m,MouseButtonsbutton,Int32clicks)在System.Windows.Forms.Control.WndProc(Message&m)在System.Windows.Forms.ButtonBase.WndProc(Message&m)在System.Windows.Forms.Button.WndProc(Message&m)在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtrhWnd,Int32msg,IntPtrwparam,IntPtrlparam)在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&msg)在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtrdwComponentID,Int32reason,Int32pvLoopData)在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32reason,ApplicationContextcontext)在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32reason,ApplicationContextcontext)在System.Windows.Forms.Application.Run(FormmainForm)在TestService.Program.Main()位置E:TestServiceProgram.cs:行号18在System.AppDomain._nExecuteAssembly(RuntimeAssemblyassembly,String[]args)在System.AppDomain.ExecuteAssembly(StringassemblyFile,EvidenceassemblySecurity,String[]args)在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()在System.Threading.ThreadHelper.ThreadStart_Context(Objectstate)在System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallbackcallback,Objectstate,BooleanignoreSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallbackcallback,Objectstate)在System.Threading.ThreadHelper.ThreadStart()InnerException:System.Runtime.InteropServices.COMExceptionMessage=灾难性故障(异常来自HRESULT:0x8000FFFF(E_UNEXPECTED))Source=""ErrorCode=-2147418113InnerException:

解决方案

解决方案二:
直接在工程中插入引用dll试试,打包的时候,报靶这个dll文件一块打包到目录下
解决方案三:
VB和C#测试时是同一台机器(环境)吗?都是32位系统?
解决方案四:
用regsvr32注册之后,你引用到工程里面没有?如果这com组件不依赖硬件,你可以发给我,帮你看看:sdl2002lyx@163.com
解决方案五:
com组件可以直接加入项目引用,然后就可以按早期bind方式直接实例化并调用了,没必要使用反射啊,除非有特别的要求.另外,如果你坚持使用反射,可以试试这样是否可以:oType.InvokeMember("Login",System.Reflection.BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Instance,null,o,parts);

解决方案六:
我觉得最好是加入Com引用,然后使用vs生成的代理类。
解决方案七:
最近,我也遇到这个问题……调用异常:System.InvalidCastException:无法将类型为“Dnb3.ClassCkyClass”的COM对象强制转换为接口类型“Dnb3._ClassCky”。此操作失败的原因是对IID为“{5811805B-18DE-41BD-8265-3E0A1F390FC3}”的接口的COM组件调用QueryInterface因以下错误而失败:不支持此接口(异常来自HRESULT:0x80004002(E_NOINTERFACE))。在Dnb3.ClassCkyClass.set_Commport(Int16Commport)但是这个参数在VB里面是Integer,在C#里面就是short,我也是传的short,肯定没问题的,但是库里类的某些方法在C#里看不到,后来我用了vs自带的tlbimp.exe程序转换了下dll文件,命令如下:tlbimpTestLib.dll/transform:dispret/out:myTestLib.dll这样C#里面都可以看到类的方法了,不过暂时没测试是否没这个异常了……
解决方案八:
该回复于2012-01-19 09:12:37被版主删除
解决方案九:
该回复于2012-01-19 10:22:45被版主删除
解决方案十:
是不是找不到路径呀。。。。

时间: 2024-10-25 02:15:28

c#调用com的问题,请教的相关文章

cxf-CXF动态生成client调用服务端,服务端收到参数为空,请教如何解决?

问题描述 CXF动态生成client调用服务端,服务端收到参数为空,请教如何解决? 请教大家一个问题. java做客户端,c#做服务端.java用apache.cxf的DynamicClientFactory或者JaxWsDynamicClientFactory根据wsdl生成client,调用服务端传递UserSyncData对象,服务端方法收到的参数对象是null,请问大家有解决办法吗?(需求:一定要用动态生成客户端的方式) 传递的对象UserSyncData 是jdk或者用cxf的wsdl

nvoke-请教一个VC调用JS的问题

问题描述 请教一个VC调用JS的问题 请教一个问题,我用VC调用JS, 我用的是WEBSOCKET长连接,我第1次调用SendData,会收到1个返回data, 第2次用,却会收到2个返回(正确的应该只有1个),第3次收到3个返回... 这个HTML在浏览器中使用是正常的,而我用VC调用的时候就不正常了,这是为什么? JS代码: //接收服务器返回值 socket.on('message', function(data){alert(data);}; //发送数据 function SendDa

json-MyEclipse2014调用JSON方法?

问题描述 MyEclipse2014调用JSON方法? 请教各位大侠 原MyEclipse8.5调用方法在MyEclipse2014失效.Ajax对应的URL路径调用不到后台方法 解决方案 JSONObject.fromObject()么?

c#调用c++的DLL,不能正确返回值,高手帮忙解决,急!!!!

问题描述 有一个C++生成的dll,名称为test.dll,入口点为_datadown@12其中包含一个方法stringdatadown_sp(stringinputstring,stringtype,refstringoutstring).其中,type值为固定的,TYPE="U".在C#中调用后,不能正常返回值.正常运行的结果应该返回两个值,一个是datadown_sp.一个是outstring.但调用后,datadown_sp返回乱码,outstring返回初始定义的值.代码如下

sqlserver 存储过程-关于一个数据库触发器的问题

问题描述 关于一个数据库触发器的问题 请教一个数据库相关的问题 各位大神好,小弟现正使用sqlserver数据库,现有这么一个需求, 需要监视有关 表A 的插入,修改,删除 操作,并需要将新的整条数据形成类似 <tbrecord id="某一行的ID" columnAname="该行的列名为columnAname的值" columnBname="该行的列名为columnAname的 值">tbName(表的名称) 一个xml字符串保存

软件写入注册表失败,如何解决

问题描述 软件写入注册表失败,如何解决 详细描述: 注册表位置:HKEY_LOCAL_MACHINESOFTWAREClassesInterface{3DBE2D24-513D-42D5-90B5-06F3339DDB30}ProxyStubClsid[] 注册表内容:{00020424-0000-0000-C000-000000000046} 进程:C:会计从业资格考试Execufow.exe 父进程:C:会计从业资格考试ExecUFZz.exe , (103)] --------------

service-android中clipboard broadcast接收器的问题

问题描述 android中clipboard broadcast接收器的问题 我想创建一个简单的在后台运行的 service.当有人从浏览器或sms中复制任何文本资料时,就会有一个toast显示该文本.我用的以下代码来实现当有电话时,就会给出toast. public class MyPhoneReceiver extends BroadcastReceiver { @Override public void onReceive(Context context Intent intent) {

rmi-Exception in thread &amp;amp;quot;Thread-11&amp;amp;quot; java.lang.AbstractMethodError

问题描述 Exception in thread "Thread-11" java.lang.AbstractMethodError java rmi在调用服务端方法,个别的方法调用不了,报下面的错误,有的方法可以正常调用到..请教一下原因.Exception in thread "Thread-11" java.lang.AbstractMethodError: com.hit.www.rmi.sms.SmsRmiMgrImpl_Stub.poolToFail(L

ios移植-使用OPENGLES2.0在安卓上如何实现增量点绘?

问题描述 使用OPENGLES2.0在安卓上如何实现增量点绘? 我在iOS上使用openGLES2.0实现了一个增量点绘的功能. 即我点击屏幕的某个位置,则在那个位置增加一个三角形. 我使用的是GLKView,在 -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect; 里调用如下方法 (不clear) glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPoin

axis-多线程调用Axis客户端异常问题请教

问题描述 多线程调用Axis客户端异常问题请教 相同版本程序大部分时间可以正常运行(一直为bug不规律出现烦恼,提升并发线程数量不会增加其出现频率,至今出现2次), 偶尔启动运行抛出以下异常(不存在参数个数不匹配问题).下附异常信息与代码片段: javax.xml.rpc.JAXRPCException: Number of parameters passed in (1) doesn't match the number of IN/INOUT parameters (2) from the