.Net COM DLL无法通过appdomains从vb6运行

时间:2009-04-19 03:31:41

标签: com vb6 appdomain

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

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

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

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

如果我同时删除了marshalbyref和serializable,那么只有当com对象被vb6实例化时,才能正常工作。如果appdomain中的.net功能创建了对象并指定要传递回vb6,则vb6会给我自动化错误。

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

有人有什么想法吗?

谢谢。

赛斯

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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