Vorbei an einer C# - Klasse, Objekt in und aus einer C++ - DLL-Klasse

Ich ve wurden arbeiten an einem Prototyp-code-Anwendung in C# und verwendet Klassen und Funktionen aus älteren C++ - code (in form einer DLL importiert). Die code-Voraussetzung ist das bestehen in einer Objekt-Klasse, die unmanaged C++ - DLL (C#) und haben es gespeichert/geändert für den Abruf später durch die C# - Anwendung. Hier ist der code, den ich bisher...

Einfache C++ - DLL-Klasse:

class CClass : public CObject
{
public:
    int intTest1
};

C++ - DLL-Funktionen:

CClass *Holder = new CClass;

extern "C"
{
    //obj always comes in with a 0 value.
    __declspec(dllexport) void SetDLLObj(CClass* obj)
    {
        Holder = obj;
    }

    //obj should leave with value of Holder (from SetDLLObj).
    __declspec(dllexport) void GetDLLObj(__out CClass* &obj)
    {
        obj = Holder;
    }
}

C# - Klassen und Wrapper:

[StructureLayout(LayoutKind.Sequential)]
public class CSObject
{
    public int intTest2;
}

class LibWrapper
{
    [DLLImport("CPPDLL.dll")]
    public static extern void SetDLLObj([MarshalAs(UnmanagedType.LPStruct)] 
      CSObject csObj);
    public static extern void GetDLLObj([MarshalAs(UnmanagedType.LPStruct)] 
      ref CSObject csObj);
}

C# Funktion Aufrufen, um DLL:

class TestCall
{
    public static void CallDLL()
    {
        ...
        CSObject objIn = new CSObject();
        objIn.intTest2 = 1234; //Just so it contains something.
        LibWrapper.SetDLLObj(objIn);
        CSObject objOut = new CSObject();
        LibWrapper.GetDLLObj(ref objOut);
        MessageBox.Show(objOut.intTest2.ToString()); //This only outputs "0".
        ...
    }
}

Nichts aber junk-Werte angezeigt werden, die innerhalb der DLL (kommen aus der übergebene C# - Objekt). Ich glaube, ich bin fehlt etwas mit der Klasse marshalling oder memory/pointer Problem. Was bin ich?

Bearbeiten:
Ich änderte den obigen code, um änderungen an der Methode/Funktion-Definitionen in C#/C++, vorgeschlagen von Bond. Der Wert (1234) weitergegeben werden abgerufen, indem der C# - code jetzt korrekt. Dies entlarvt ein weiteres Problem in der C++ - DLL. Der Wert 1234 wird, die nicht der C++ - code. Statt das Objekt hat einen Wert von 0 innerhalb der DLL. Ich möchte vordefinierte C++ - Funktionen zum Bearbeiten des Objekts von innerhalb der DLL. Jede weitere Hilfe ist sehr geschätzt. Danke!

  • __declspec(dllexport) void SetDLLObj(CClass obj) { Inhaber = &obj; } wund Zeiger der lokalen CClass, so können Sie junk-Mitbenutzung, dass.
  • der Halter scheint zu sein, speichern Sie den Wert in den kommenden C++ - code für den Abruf später. Kann ich einen Blick an ihm nehmen, sondern meine größte Sorge im Moment ist, ziehen Sie einen Wert aus dem Objekt an die DLL.
InformationsquelleAutor notsodev | 2012-06-20
Schreibe einen Kommentar