【发布时间】:2010-04-01 11:27:50
【问题描述】:
我有一些需要与我的 .Net 引擎应用程序通信的旧版 vb6 应用程序。 引擎提供了一个可以通过.net Remoting连接的接口。
现在我有一个存根类库,它包装了接口公开的所有类型。这个存根的目的是将我的 .net 类型转换为 COM 友好的类型。当我将这个类库作为控制台应用程序运行时,它能够连接到引擎,调用各种方法,并成功返回封装的类型。
链中的下一步是允许我的 VB6 应用程序调用这个启用 COM 的存根。 这适用于我的主引擎条目类型(包装为 COM_ModelFetcher 的 IModelFetcher)。但是,当我尝试获取任何模型获取器的模型类型(IClientModel,包装为 COM_IClientModel,IUserModel,包装为 COM_IUserModel 等)时,我得到以下异常:
[Exception - type: System.InvalidCastException 'Return argument has an invalid type.'] in mscorlib
at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType)
at System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at AWT.Common.AWTEngineInterface.IModelFetcher.get_ClientModel()
at AWT.Common.AWTEngineCOMInterface.COM_ModelFetcher.GetClientModel()
当我看到这个时,我做的第一件事是处理“AppDomain.CurrentDomain.AssemblyResolve”事件,这使我能够加载所需的程序集。但是,我现在仍然收到此异常。我的 AssemblyResolve 事件处理程序正在正确加载三个程序集,我可以确认它在此异常之前没有被调用。
有人可以帮我解开这个混乱的进程间通信吗?!
更新 1
这似乎与将类型拉过远程边界有关。例如,我可以创建一个 COM_Client 对象,并将它从存根发送到 VB6。这绝对没问题。 但是在相同的方法中,如果我尝试使用(远程处理)从引擎获取客户端,则该方法会失败并出现相同的异常。我什至没有尝试返回对象 - 只是调用引擎的行为会引发异常......
【问题讨论】:
-
跟踪您的 DLL 的副本。看起来客户端或服务器正在使用旧的。
-
嗨,好的;我花了一段时间确保 dll 版本是相同的,我可以确认它们是相同的。感谢您的建议!
标签: .net com vb6 interop remoting