Struct mit Arrays an C++ DLL übergeben



  • Hallo,

    in C# würde ich gerne ein Struct an eine C++ DLL übergeben, was anscheinend auch funktioniert, da ich den richtigen Rückgabewert erhalte. Allerdings kann ich nicht in das Array schreiben. Ich erhalte dann die folgende Meldung:

    An unhandled exception of type 'System.AccessViolationException'occurred in demo.exe
    Additional information: Attempted to read or writhe protected memory. This is often an indication that other memory is corrupt.

    Kann mir bitte jemand Helfen und vielleicht sagen wo der Fehler ist?

    In C++ bzw. in der DLL sieht das so aus:

    struct myStructArrays {
    		float myArray[];
    		float* my2DArray;
    	};
    
    	float calculateArray(struct myStructArrays myArrays[], int size){
    		// In Array schreiben
    		myArrays[0].myArray[0] = 12;
    		myArrays[0].my2DArray[0] = 23;
    
    		// Wert zurückgeben
    		return myArrays[0].myArray[1];
    	}
    

    In C# nutze ich folgende Importbeschreibung:

    private struct myStructArrays
            {
                public float[] myArray;
                public float[,] my2DArray;
            }
    
            [DllImport("myDLL.dll")]
            private static extern float calculateArray([In, Out] myStructArrays[] myArrays, int size);
    

    und zum Testen habe ich folgendes versucht:

    float[] myArray = new float[3];
            myArray[0]=1;
            myArray[1]=2;
            myArray[2]=3;
    
            float[,] my2DArray = new float[3, 3];
            // ...
    
            myStructArrays[] myArrays = new myStructArrays[2];
            myArrays[0].myArray = myArray;
            myArrays[0].my2DArray = my2DArray;
    
            Console.WriteLine(myArrays[0].myArray[0]);
    
            float ret = calculateArray(myArrays, 2);
    
            Console.WriteLine(ret);
            Console.WriteLine(myArrays[0].myArray[0]);
    


  • Sharpie schrieb:

    In C++ bzw. in der DLL sieht das so aus:

    struct myStructArrays {
    		float myArray[];
    		float* my2DArray;
    	};
    

    Das ist aber nicht C++. Bei Arrays musst du die Dimension angeben. Der Zeiger ist ausserdem nicht initialisiert, du solltest schon mit new Speicher anfordern.



  • Du hast recht, es funktioniert wenn ich folgendes in C# mache:

    private struct myStructArrays
    {
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 5)]
        public float[] myArray;
        public float[,] my2DArray;
    }
    

    und in C

    struct myStructArrays {
            float myArray[5];
            float* my2DArray;
        };
    

    Allerdings habe ich mich dann auf eine bestimmte Größe festgelegt, was ich nicht möchte. Außerdem ist mir nicht klar wie es bei dem my2DArray funktionieren soll. An eine Funktion kann ich ja auch ein Array mit unbestimmter Größe übergeben:

    myFunction(float myArray[], float* my2DArray);
    

    ggf. noch die Größe von dem Array in der DLL bekannt machen und alles funktioniert.

    Kann mir jemand sagen, wie ich die Arrays in unterschiedlichen Größen für das Struct übergeben kann, so wie es in der Function auch möglich ist?


Anmelden zum Antworten