我在VB6 DLL中找到的方法中添加了3个可选的布尔参数。容纳它的类是MultiUse(公共),方法本身是私有的。该类实现TLB的特定接口,允许公共调用此方法。
在VB6端添加3个可选参数后,我修改了相关的C#代码,以便指定3个可选参数。它构建良好...但是,当我尝试运行该代码时,它失败并显示以下错误消息:
找不到方法:'布尔值 MyTLBName.IMyClassName.MyMethod(System.Object的, System.String,Boolean,Boolean, Int32,Int32 ByRef,System.Object, System.Object,System.Object,Boolean, Boolean,Boolean)'。
注意错误消息中是如何显示所有3个布尔参数的?看起来很好......我知道在从C#调用方法时我指定了3个布尔值。
可疑,我检查了OLEView中的MyTLBName.IMyClassName接口,看到了这个:
[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个参数)
答案 0 :(得分:5)
目前,C#在使用可选参数调用VB6函数时遇到问题。在一个我绝对需要使用外部供应商提供的VB6组件的项目中,我非常努力地使用这个。
我发现最简单的解决方案是在VB中创建一个类来调用这些函数,因为VB.Net DOES支持可选参数,然后从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