0

我们有一个大型的 vb6 应用程序,由于我们需要更改/修复一些东西,我们正在将部分移动到 .net,以框架 2.0 为目标。我们已经将一堆类移动到 .net dll 中,并且它们已正确设置以暴露给 com。

这就是问题所在:MainAppVB6.exe 实例化了 DOTNET_COM.ComClass。它将这个传递给不同的.net dll 中的一个方法,该方法将它传递给一个appdomain。对于用 vb6 编写的 COM 对象,这根本不是问题。

.net 查看 appdomain 边界,并希望对象可序列化或 marshalbyref。由于我们需要 .net 部分来更改返回到 vb6 的数据,因此可序列化不起作用。如果我们在 Inherits MarshalByRefObject 标记类,那么我们会得到“这个远程代理没有通道接收器,这意味着服务器没有注册的服务器通道正在监听,或者应用程序没有合适的客户端通道与服务器通信”。

没有渠道——我们只是在同一个 dll 中跨过一个 appdomain。.net 似乎没有将对象视为 COM,它应该这样做。

如果我同时删除 marshalbyref 和可序列化,则只有当 com 对象由 vb6 实例化时才会起作用。如果 appdomain 中的 .net 功能创建对象并分配给以传递回 vb6,则 vb6 会给我自动化错误。

一个非常丑陋的事情是序列化新appdomain中的对象,发回xml,然后让vb6反序列化,但这看起来很荒谬。

有人有想法么?

谢谢你。

赛斯

4

2 回答 2

0

您可以在您的第一个 .NET 方法中为您的 COM 类上的适当 mutator 方法创建一个委托,将该委托传递给 AppDomain 边界,使用该委托在第二个 .NET 方法中改变您的 COM 对象,然后返回变异的对象到 VB6。Marshal 类中的方法可能会派上用场。:)

从评论编辑:如何在第一个 .net 调用中创建 vb6 类的 .net 副本,将该新对象传递给您需要进行的所有 .net 调用,然后修复您的 com 对象返回。这可能比 vb6 中的反序列化更容易。

于 2009-04-19T03:48:00.613 回答
0

您必须创建一个中间汇编程序外观。然后您在应用程序外观中创建一个 AppDomain - 它将负责管理具有 dll vb6 的应用程序的管道。

vb <===> Facade (appDomain) <====> 登录有 dll vb6

于 2018-02-02T19:40:29.053 回答