将NULL从VB6窗口传递给.NET可空Int32

时间:2014-02-22 11:01:41

标签: c# vb6 interop int nullable

我有一个调用.NET方法的VB6窗口,将输入从其控件的值传递给C#代码。

我希望能够将NULL传递给(Int32?)的C#参数,但我的VB6代码中没有找到任何允许我这样做的内容。

这可能吗?如果是这样,我需要从VB6传递给我的.NET方法中的NULL什么值?

3 个答案:

答案 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