【问题标题】:COM Interop with VB6 and C#COM 与 VB6 和 C# 的互操作
【发布时间】:2011-07-02 10:33:49
【问题描述】:

我正在编写一个将由 VB 6 程序使用的 C# COM 对象。这应该不是什么大问题,但是,对 COM 对象的 VB6 调用传入了一个 VB 控件(在本例中是一个文本框)。程序期望 COM 对象更改控件的 Text 属性。不幸的是,我必须坚持使用这个界面,因为我正在处理其他人的遗留代码。

如何设置传入的TextBox的属性?我是否只需创建一个带有 Text 属性的接口并将input 转换为该接口?这甚至可能吗?

如果我需要澄清,请告诉我。注意:我打算省略以下代码中的 COM 声明。

// C# COM Object Interface
public interface IObj
{
    // This function must receive the argument of type object.
    void Test(object input);
}

// C# COM Object Implementation
public class Obj : IOjb
{
    // A VB6 TextBox is passed into here,
    // expecting a change to the Text property.
    public void Test(object input)
    {
        // INSERT NECESSARY CODE HERE

        input.Text = "arbitrary string";
    }
}


// VB 6
comObject.Test (txtBox)

【问题讨论】:

  • 当前的COM对象是怎么做的?您需要复制其所有方法的签名。
  • 当前 COM 对象是一个 VB6 COM 对象,它接受object 类型的参数。所以这应该是签名的副本。

标签: c# com vb6 com-interop


【解决方案1】:

您应该将用于更新文本框的代码和任何其他 UI 特定代码放入 VB6 COM 对象中,并将任何非 UI 代码交给 C# 类,这样您就不必处理 VB6 UI 控件在 C# 中。

【讨论】:

  • 啊,是的,我认为这是一种解决方法。如果可能的话,它想避免这种情况。不过还是谢谢。
  • 这感觉像是一个更简洁的解决方案,为什么要从非 UI 代码修改任何控件?
  • 我同意本的意见。在 .NET 解决方案中处理 VB6 控件……您只是在自找麻烦。
  • +1。即使这是狡猾的。 VB6 文档说通过 COM 将控件传递给外部组件是非法的。这就是为什么它在 COM 接口中被键入为 Object 而不是 VBA.TextBox,以便 VB6 编译器允许它通过。它可能有时会起作用,但我不想自己依赖它。
  • @MarkJ 非常感谢您的帮助,我找到了(并在stackoverflow.com/questions/5154895/… 发布了答案)。
【解决方案2】:

您使用的是 .Net 4.0 吗?

您可以尝试使用新的动态语言功能:

public void Test(object input)
{
    dynamic textBox = input;
    //Assuming there is a property named Text at runtime
    textBox.Text = "arbitrary string";
}

这应该相当于 COM 中的后期绑定。

您也可以尝试在方法声明中使用动态。

【讨论】:

  • 不幸的是我不是。不过,如果我能掌握 VS 2010,我可能会尝试一下。
  • 试试2010的速成版看看能不能用。如果这是一个巨大的应用程序,不确定是不是说起来容易做起来难。
  • 如果你愿意使用 VB.Net,你可以在 VS 2008 甚至 2005 或 2002 中尝试这个。只需使用Option Strict Off。我建议您将Option Strict Off 限制为一个模块。在.Net 4 之前,VB 在这方面优于 C# :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2014-12-17
  • 2010-12-14
  • 2011-02-01
  • 2012-06-18
  • 2012-03-24
  • 2023-04-04
相关资源
最近更新 更多