【问题标题】:.Net COM DLL not working from vb6 across appdomains.Net COM DLL 不能跨 appdomains 从 vb6 工作
【发布时间】:2010-10-20 08:53:47
【问题描述】:

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

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

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

没有渠道——我们只是通过同一个 dll 中的一个应用程序域。 .net 似乎没有将对象视为 COM,它应该这样做。

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

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

有人有什么想法吗?

谢谢。

赛斯

【问题讨论】:

    标签: com vb6 appdomain


    【解决方案1】:

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

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

    【讨论】:

    • 这适用于一些属性,但单独的应用程序域中的代码必须修改数十个属性以及将新对象添加到集合中。它正在解析数据,使用此结果填充 com 对象,并将其传递回 vb6。我倾向于让它传回序列化......
    【解决方案2】:

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

    vb Facade (appDomain) 登录有 dll vb6

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多