我有一个调用.NET方法的VB6窗口,将输入从其控件的值传递给C#代码。
我希望能够将NULL
传递给(Int32?
)的C#参数,但我的VB6代码中没有找到任何允许我这样做的内容。
这可能吗?如果是这样,我需要从VB6传递给我的.NET方法中的NULL
什么值?
答案 0 :(得分:6)
你做不到。实际上,您甚至无法在VB6项目中查看方法。在.NET程序集上运行Tlbexp.exe应始终生成类似于以下内容的警告:
TlbExp:警告TX8013117D:键入库导出器警告处理'IFoo.test(arg),ClassLibrary1'。警告:类型库导出器在签名中遇到泛型类型实例。通用代码可能无法导出到COM。
由以下人员制作:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IFoo {
void test(int? arg);
}
生成的类型库将不具有test()方法。它无法调用。它抱怨的通用类型是Nullable<T>
,你的Int32?这是一个简写符号。
简而言之,您的C#根本不适合从像VB6这样的COM客户端使用。您必须将参数声明更改为 object 。首先测试null,然后测试为(短),VB6的自然拟合。或者使用Convert.ToInt32()灵活地了解客户端使用的值类型。
答案 1 :(得分:0)
尝试将Nothing传递给参数。它充当空值。
答案 2 :(得分:0)
不知道自@HansPassant 回答以来这些年来发生了什么变化,但我能够轻松地在 VB6 中使用 C# 可空值:
C#
[ComVisible(true)]
[Guid(...)]
public class Foo
{
private int? _arg;
public int? Arg => _arg;
public void Test(int? arg)
{
_arg = arg;
}
}
VB6:
Dim foo As New Foo
foo.Test CLng(1234)
Debug.Print foo.Arg '1234
foo.Test Empty
Debug.Print IsEmpty(foo.Arg) 'True
foo.Test CLng(4321)
Debug.Print foo.Arg '4321