2015-07-15 1 views
2

Когда я маршалу моя функция возвращает string[] в UnmanagedType.Struct с SafeArraySubType = VarEnum.VT_ARRAY как вМожет ли маршал строка [] перейти к варианту safearray?

namespace StackOverflow 
{ 
    [ComVisible(true)] 
    [Guid("4BDC43D4-8FD7-4F58-BEE5-E57C3C144C1B")] 
    public class Array 
    { 
    [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] 
    public string[] StringArray() 
    { 
     return new string[] { "foo", "bar" }; 
    } 
    } 
} 

Я ожидал получить вариант (UnmanagedType Enumeration)

STRUCT
ВАРИАНТ, который используется, чтобы мобилизовывать управляемые отформатированные классы и типы значений.

Однако код VBScript

WScript.Echo TypeName(CreateObject("StackOverflow.Array").StringArray) 

сообщает String() (который не является Variant() и поэтому я получить тип ошибки missmatch позже, когда экранный массив).

Когда я изменить свой код либо

public object[] ObjectArray() 
{ 
    return new object[] { "foo", "bar" }; 
} 

public object PlainObject() 
{ 
    return new object[] { "foo", "bar" }; 
} 

кода VBScript, кажется, работает хорошо, однако я хотел бы знать, почему я не могу вернуть string[] и вручную Маршаллу его к варианту, содержащий SAFEARRAY из варианты.

Похоже, что SafeArraySubType не имеет никакого эффекта. Какая у меня ошибка?

ответ

0

Thats потому, что SafeArraySubType применяется только к SafeArrays.

MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] 
+0

Я считаю, что маловероятно, учитывая http://stackoverflow.com/questions/5079200/how-to-correctly-marshal-vb-script-arrays-to-and-from-a-com-component-written -in использует 'UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY'. –

+0

Это потому, что SafeArraySubType игнорируется для структур. Структуры по природе уже являются «вариантным массивом» (https://msdn.microsoft.com/en-us/library/vstudio/system.runtime.interopservices.unmanagedtype(v=vs.100).aspx), поскольку они их структура свойств в последовательности. –

Смежные вопросы