Я хотел бы переместить довольно сложные типы из управляемого в родной мир и наоборот.
В настоящее время это делается путем создания многомерных безопасных массивов, которые имеют то преимущество, что маршаллинг выполняется для вас, но это означает, что мы получаем довольно сложные зубчатые массивы, чтобы наши головы вокруг.
Я пытался поместить некоторые структуры в SAFEARRAY, но столкнулся с проблемами, очень похожими на этот вопрос без ответа. msdn , кажется, подразумевает, что это возможно, но у меня небольшой успех. Если это возможно, каковы допустимые типы VT_ в следующей ситуации?
edit: Спасибо! Так что это должен быть VT_RECORD.
struct Change
{
PSTR key;
PSTR val;
};
struct NodeChages
{
int nodeId;
SAFEARRY* changes; //CComSafeArray<Change>
};
STDAPI func(/*CComSafeArray<NodeChanges>*/ SAFEARRAY * f);
На управляемой стороне у меня есть.
public struct Change
{
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string key;
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string value;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NodeChanges
{
public int nodeId;
[MarshalAsAttribute(UnmanagedType.SafeArray, SafeArrayUserDefinedSubType = typeof(CurveChange))]
public Change[] changes;
}
[DllImportAttribute("My.dll", EntryPoint = "Func", PreserveSig = true, CallingConvention=CallingConvention.StdCall)]
public static extern void Func(
[MarshalAsAttribute(UnmanagedType.SafeArray, SafeArrayUserDefinedSubType = typeof(NodeChange))]
NodeChange[] changes
);
Но это (как в другом посте ) дает мне:
System.ArgumentException : The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))