2010-02-10 7 views
4

J'ai le code suivant dans C++ que je dois être en mesure d'appeler à partir de C#:maréchal safearray de struct dans struct

struct Inner 
{ 
double data1; 
double data2; 
}; 

struct Outer 
{ 
double data3; 
SAFEARRAY innerData; 
}; 

int WINAPI ProcessData (Outer& outer) 
{ 
    ... 
} 

J'essayé ce qui suit, mais il ne fonctionne pas Qu'est-ce que je fais mal?

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct Inner 
{ 
public double data1; 
public double data2; 
} 

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct Outer 
{ 
public double data3; 
[MarshalAsAttribute(UnmanagedType.Safearray,ArraySubType = UnmanagedType.Struct)] 
public Inner[] innerData; 
} 
+0

Il est impossible de deviner le type d'élément à partir de la déclaration. Utilisez object [] si le tableau stocke des variantes. –

Répondre

1

Avez-vous essayé?

[StructLayoutAttribute (LayoutKind.Sequential)] 
    public struct Outer 
    { 
    public double data3; 
    [MarshalAsAttribute (UnmanagedType.SafeArray, SafeArrayUserDefinedSubType=typeof(Inner))] 
    public Inner [] innerData; 
    } 
+0

[MarshalAsAttribute (UnmanagedType.SafeArray, SafeArrayUserDefinedSubType = typeof (intérieur))] fonctionne correctement. –

0

Il semble que la déclaration d'attribut est incorrect comme refus de compiler ...

 
[StructLayoutAttribute(LayoutKind.Sequential)] 
     public struct Outer 
     { 
      public double data3; 
      [MarshalAsAttribute(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_SAFEARRAY)] 
      public Inner[] innerData; 
     } 

Hope this helps, Meilleures salutations, Tom.

0

Quand j'essaie ceci: [MarshalAsAttribute (UnmanagedType.SafeArray, SafeArrayUserDefinedSubType = typeof (intérieur))]

je reçois: Une exception non gérée du type 'System.ArgumentException' a eu lieu dans Driver.exe

Informations complémentaires: Le paramètre est incorrect. (Exception de HRESULT: 0x80070057 (E_INVALIDARG))