c# - C# 是否有可能在调用具有可选参数的 VB6 方法时出现问题?

标签 c# interface com vb6 typelib

我向 VB6 DLL 中的一个方法添加了 3 个可选的 bool 参数。容纳它的类是 MultiUse(公共(public)),方法本身是 Private。该类实现来自 TLB 的特定接口(interface),允许公开调用此方法。

在VB6端添加了3个可选参数后,我修改了相关的C#代码,使其指定了3个可选参数。它构建良好...但是,当我尝试运行该代码时,它失败并显示以下错误消息:

Method not found: 'Boolean MyTLBName.IMyClassName.MyMethod(System.Object, System.String, Boolean, Boolean, Int32, Int32 ByRef, System.Object, System.Object, System.Object, Boolean, Boolean, Boolean)'.

请注意错误消息中如何显示所有 3 个 bool 参数?对我来说看起来不错...我知道我在从 C# 调用方法时指定了这 3 个 bool 值。

可疑,我检查了 OLEView 中的 MyTLBName.IMyClassName 接口(interface),看到了这个:

[id(0x60030000)]

HRESULT MyMethod(
                //Cut out the other parameters - they are working fine.
                [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMyFirstOptionalBoolean, 
                [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMySecondOptionalBoolean, 
                [in, optional, defaultvalue(-1)] VARIANT_BOOL blnMyThirdOptionalBoolean, 
                [out, retval] VARIANT_BOOL* __MIDL_0324);

同样,3 个可选参数是可见的,看起来不错。

在我看来它应该可以工作...但也许我遗漏了一些东西。

有什么方法可以使它工作而不必在 TLB 中创建另一个版本的“MyMethod”? (使用不同的名称,并且这 3 个参数是必需的而不是可选的)

最佳答案

目前,C# 在调用带可选参数的 VB6 函数时确实存在问题。在我绝对需要使用外部供应商提供的 VB6 组件的项目中,我非常努力地使用这个。

我发现最简单的解决方案是在 VB 中创建一个类来调用这些函数,因为 VB.Net 确实支持可选参数,然后从 C# 调用该 VB6 类。

在用 VB.Net 编写的类中,我按照正确的方法重载提供了几种方法来调用一个 VB6 函数。

示例 - 假设 VB6 函数有三个参数,第一个是必需的,第二个是可选的,我将在 VB.Net 组件中创建三个函数。

Public Sub CallComponent(byVal myParameter as Integer)
  ....call component with one parm
End Sub

Public Sub CallComponent(byVal myParameter as Integer, byVal parm2 as  String,)
  ....call component with two parms
End Sub

等...

而且可选参数似乎会出现在 4.0 中:http://geekswithblogs.net/michelotti/archive/2009/02/05/c-4.0-optional-parameters.aspx

关于c# - C# 是否有可能在调用具有可选参数的 VB6 方法时出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1688445/

相关文章:

c# - 如何在 .net 解决方案中有两个项目,一个针对 4.0 框架,另一个针对 4.5 框架?

c# - 当 ImageLocation 不起作用时,如何在 C# 中获取 PictureBox 的 imageURL?

c# - 如何从日期时间对象获取短日期格式

.net - .NET 4.0 迁移后引用 .NET 1.0 程序集的 System.TypeLoadException

c# - 如果路径包含 "#",则 System.Uri 无法提供正确的 AbsolutePath 和 LocalPath

c# - 使用接口(interface)在 C# 中进行转换,以便能够使用所有对象功能

C# - 接口(interface)不能包含运算符

Java - 实现接口(interface)

c# - 在 C# COM 中处理 NULL 指针输出参数

f# - 如何在 F# 中创建 COM 对象