C# Safearray, wie initialisieren?

ehonk

Cadet 3rd Year
Registriert
Juni 2004
Beiträge
52
Hi all

in meinem Projekt verwende ich die COM-Schnittstelle zu einem CAD-Programm. Dabei möchte ich in C# den Massenmittelpunkt auslesen. Die Methode sieht nun folgendermassen aus:

Code:
void product_sub.Analyze.GetGravityCenter(array);

Ich finde per Google einfach nicht wie muss ich in C# ein Safearray initialisiern?
Mit int[] n1 = new int[3] erstelle ich ja z.b. ein normales Vektorarray.

danke euch
 
Du brauchst ne SAFEARRAY Structure.
Standardmäßig liefert .NET da leider nix mit.

Du kannst aber das Visual Studio SDK installieren: klick
Da is ne Definition enthalten: SAFEARRAY Structure


oder du probierst mal die Definition (automatisch generiert):
Code:
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tagSAFEARRAY {
    
    /// USHORT->unsigned short
    public ushort cDims;
    
    /// USHORT->unsigned short
    public ushort fFeatures;
    
    /// ULONG->unsigned int
    public uint cbElements;
    
    /// ULONG->unsigned int
    public uint cLocks;
    
    /// PVOID->void*
    public System.IntPtr pvData;
    
    /// SAFEARRAYBOUND[1]
    [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=1, ArraySubType=System.Runtime.InteropServices.UnmanagedType.Struct)]
    public tagSAFEARRAYBOUND[] rgsabound;
}

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tagSAFEARRAYBOUND {
    
    /// ULONG->unsigned int
    public uint cElements;
    
    /// LONG->int
    public int lLbound;
}
 
danke für den Tipp
nun bin ich etwas weitergekommen:

Code:
 [StructLayout(LayoutKind.Sequential)]
        [ComVisible(true)]
        public struct teststruct
        {
              [MarshalAs(UnmanagedType.SafeArray)]
            public double[] dparameters;

           

        };


...
teststruct ts1= new teststruct();
product1.Analyze.GetGravityCenter(ts1.dparameters);
...

Jetzt bekomme ich als Fehlermeldung:
Der Wert liegt außerhalb des erwarteten Bereichs.

Auf was bezieht sich das genau? Auf den datentyp?
 
Überleg einfach mal wo du bei einem Array einen (Werte-)Bereich hast
 
Zurück
Oben