如何将.NET中的Null对象编组为COM作为对象类型?

时间:2011-05-13 20:32:25

标签: .net marshalling com-interop

在从VB6迁移到.NET时使用COM互操作的大型项目中,我发现需要编写从interop方法接收对象的代码,然后将该对象传递给interop形式不是空的。

我发现on MSDN空对象作为Empty变量返回。这会导致像这样的VB6代码出现问题,其中validator是interop类,而inputKey与问题无关。

Set validationObject = validator.GetValidationList(inputKey)

当变量为Empty时,不能使用Set语句。以下是该函数正在执行的操作的示例。

    Dim validationList = GetValidationList(inputKey)
    If validationList IsNot Nothing AndAlso validationList.Count > 0 Then
        Return validationList
    Else
        Return Nothing
    End If

是否有最佳实践可以将Null值作为VT_OBJECT变量返回给COM?以下代码是个好主意吗?它似乎有效,但它是“正确”的方式吗?

    Dim validationList = GetValidationList(inputKey)
    If validationList IsNot Nothing AndAlso validationList.Count > 0 Then
        Return validationList
    Else
        Return New System.Runtime.InteropServices.UnknownWrapper(Nothing)
    End If

1 个答案:

答案 0 :(得分:1)

您发布的MSDN列表似乎也显示System.DBNull将与VT_NULL匹配。

System.DBNull的MSDN页面似乎进一步支持了这一点:

Additionally, COM interop uses the DBNull class to distinguish between a VT_NULL variant, which indicates a nonexistent value, and a VT_EMPTY variant, which indicates an unspecified value.