【问题标题】:Is it possible to replace early bound module是否可以更换早期绑定模块
【发布时间】:2011-08-24 00:03:21
【问题描述】:

如果界面/GUID/等相同,则使用另一种语言编写的较新代码?

我正在尝试按照表弟帖子中的详细说明执行此操作:

Legacy VB6 app replacement

但我想我会切入正题。

谢谢!

【问题讨论】:

  • 我认为使用 COM 是可能的。这不是一个非常有趣的路线去(或停留)下来。 .NET 可以公开用于 COM 互操作,但不确定这是否是一个潜在的解决方案。
  • 这就是我所走的路线,因为我要替换的模块是 COM。但我就是无法让它工作,即使所有的 id 和呼叫似乎都排成一行,我只是不断收到自动化错误。
  • @Joh H 是否只是加载替换 COM 对象时出现错误,例如不稳定的注册表设置或其他一般故障?也就是说,是否可以从新的上下文(例如 PowerShell 或新项目)加载替换? (顺便说一句,我认为这在很多方面都违反了 COM CLSID“保证”。)
  • 可以是任意数量的东西。如果我可以从错误中获取更多信息,例如界面的哪个方面不匹配,那将很有用!您指的是什么保证?

标签: c# .net com vb6 interop


【解决方案1】:

在这种情况下,Dynamic 将无济于事,因为您说的是 VB6 应用程序引用了一个 COM 组件,该组件在 VB6(或其他)中使用,但您现在想成为 VB.net(或 C#)。

话虽如此,你应该能够做到这一点。

您需要使用 OLEView(或类似工具)为您要替换的 COM DLL 生成 MIDL。这将为您提供该 DLL 中定义的所有类和接口的特定 GUIDS。

然后您需要编写 .net 版本的 DLL,为每个类和接口指定每个 GUID。

您需要查看 .net 属性的文档:

ComVisible 指导 接口类型

可能还有更多。这些 attrs 允许您专门标记用于 dll 中的哪些对象和接口的 GUIDS。

基本上,当您为两个 DLL(旧的和新的)生成类型库时,您应该得到相同的 tlb。如果不这样做,新的将不会与旧的早期绑定引用兼容。

【讨论】:

  • 谢谢您,您已经确认了我一直在采取的方法。但是他们必须排队到什么程度呢?例如,我在新代码中的 IDL coclass 引用都包含一个到 _Object 的接口,而(显然)VB6 的东西没有。那里也有正确的界面,例如 [default] 界面 _BIBranchDetails;另外,完美有多完美?例如,如果原始 IDL 包含我没有使用的调用;他们还需要匹配吗?此外,它还调用了使用来自 VB DA 的“RecordSet”对象的“SetData”,我必须匹配它吗?或者我可以定义一个空定义吗?
  • 如果您在 VB6 应用程序中不引用类或接口,则不必包含它,并且您绝对可以包含其他类和接口(具有不同的 guid)而没有任何问题。所以,基本上,你是对的。它们不必完美对齐,只要在主机程序引用的任何 GUIDS 上即可。
【解决方案2】:

您可以使用 C# 4.0 的 dynamic 来解决许多与 COM 通信的问题。

dynamic 对象和可选参数被引入以减轻其中的一些痛苦。

【讨论】:

  • 如果消费环境不是 .net,这有帮助吗?但是替换模块是?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2011-07-17
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多