Как маршалировать нулевые объекты из .NET в COM как тип объекта? - PullRequest
1 голос
/ 14 мая 2011

В середине большого проекта, который использует взаимодействие COM при миграции с VB6 на .NET, я обнаружил необходимость написать код, который получает объект от метода взаимодействия, а затем передать этот объект в форму взаимодействия, когда объектне является нулевым.

Я обнаружил на MSDN , что нулевые объекты возвращаются как пустой вариант.Это вызывает проблему с кодом VB6, подобным этому, где validator является классом взаимодействия, а inputKey не имеет отношения к проблеме.

Set validationObject = validator.GetValidationList(inputKey)

Оператор Set нельзя использовать, когда вариант имеет значение Empty.Вот пример того, что делала функция.

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

Есть ли лучший способ получения значения Null, возвращаемого в COM как вариант VT_OBJECT?Является ли следующий код хорошей идеей?Кажется, это работает, но это ли «правильный» способ сделать это?

    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 Ответ

1 голос
/ 14 мая 2011

Список из MSDN, который вы опубликовали, также, кажется, показывает, что System.DBNull будет соответствовать VT_NULL.

Страница MSDN System.DBNull , кажется, поддерживает это далее:

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.

...