structs in arrays



  • Ich habs ja befürchtet...

    Aber nur damit ichs richtig verstehe, das klingt jetzt so als wäre das was ich machen möchte gar nicht möglich.
    Das ich aus C# jetzt dieses Array (auf irgendeine Weise) in die C++ DLL gebe, es dort bearbeite und dann (auf irgendeine andere Weise) zurückgebe ist theoretisch schon möglich ?

    Danke für die Links, dann werd ich mal anfangen zu lesen 🙂



  • So, es scheint jetzt zu laufen, in dem C# Sharp Forum hat man mir helfen können, danke nochmal Th69 für den Link !
    Wollte jetzt schnell die Lösung noch hier verewigen falls mal jmd vor dem selben Problem steht oder es einen noch interessiert:

    Es mussten lediglich die 2 Structs angepasst werden:

    Struct in C++:

    struct EventData
    {
    	char eventID1[5];
    	char eventID2[5];
    	char obNumber[5];
    	char priorityClass[5];
    	char dataIDZ1[5];
    	char dataIDZ23[5];
    	char suppDataZ11[5];
    	char suppDataZ12[5];
    	char suppDataZ21[5];
    	char suppDataZ22[5];
    	char suppDataZ31[5];
    	char suppDataZ32[5];
    	char eventText[2500];
    };
    

    Und im C# Struct muss jeder String "gemarshalled" werden:

    public struct EventData
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string eventID1;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string eventID2;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string priorityClass;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string obNumber;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string dataIDZ23;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string dataIDZ1;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string suppDataZ11;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string suppDataZ12;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string suppDataZ21;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string suppDataZ22;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string suppDataZ31;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
                public string suppDataZ32;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2500)]
                public string eventText;
            }
    

    Dadurch wird jeder String als Zeichenkette fester Größe in dem Struct abgelegt und ist mit dem charFelder Struct in C++ kompatibel.

    So braucht die C++ DLL auch keinen Rückgabewert sondern ich kann mit dem Pointer auf das C# Array direkt die Werte dort ändern.

    Ich habe noch nicht alle Testfälle abgedeckt aber bis jetzt sieht es so aus als wäre das die Lösung gewesen 🙂


Anmelden zum Antworten