Когда я маршалу моя функция возвращает 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
не имеет никакого эффекта. Какая у меня ошибка?
Я считаю, что маловероятно, учитывая 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'. –
Это потому, что SafeArraySubType игнорируется для структур. Структуры по природе уже являются «вариантным массивом» (https://msdn.microsoft.com/en-us/library/vstudio/system.runtime.interopservices.unmanagedtype(v=vs.100).aspx), поскольку они их структура свойств в последовательности. –