从VB6到.net通过COM和Remoting ......真糟糕!

时间:2010-03-31 20:17:44

标签: .net com vb6 interop remoting

我有一些传统的vb6应用程序需要与我的.Net引擎应用程序进行通信。 引擎提供了一个可以通过.net Remoting连接的接口。

现在我有一个存根类库,它包装了接口公开的所有类型。此存根的目的是将我的.net类型转换为COM友好类型。当我将这个类库作为控制台应用程序运行时,它能够连接到引擎,调用各种方法,并成功返回包装类型。

链中的下一步是允许我的VB6应用程序调用此启用COM的存根。 这适用于我的主引擎条目类型(包装为COM_ModelFetcher的IModelFetcher)。但是,当我尝试获取任何模型fetcher的模型类型(IClientModel,包装为COM_IClientModel,IUserModel,包装为COM_IUserModel,e.t.c。)时,我得到以下异常:

 [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。这绝对没问题。 但是在同样的方法中,如果我尝试使用(远程处理)从引擎获取客户端,则该方法将失败并出现相同的异常。我甚至都没有尝试返回对象 - 只是调用引擎的行为引发异常......

1 个答案:

答案 0 :(得分:0)

我发现了问题...

即使我使用AssemblyResolve方法在运行时加载dll,这还不够。将DLL放在“C:\ Program Files \ Microsoft Office \ Office12”文件夹(以及MSAccess.exe)中解决了这个问题。

现在我只需要提出比这更优雅的解决方案......