问题描述
各位:厂家提供了一个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被版主删除
解决方案十:
是不是找不到路径呀。。。。