Ho lavorato a un'applicazione di codice prototipo che viene eseguita in C# e utilizza classi e funzioni dal vecchio codice C++ (nella forma di una DLL importata). Il requisito del codice è quello di passare un oggetto di classe alla DLL C++ non gestita (da C#) e far sì che venga memorizzato/modificato per il recupero in seguito dall'applicazione C#. Ecco il codice che ho finora ...Passare un oggetto classe C# dentro e fuori una classe DLL C++
semplice C++ DLL Classe:
class CClass : public CObject
{
public:
int intTest1
};
C++ funzioni DLL:
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# classe e 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# Funzione Chiama alla 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".
...
}
}
Nulla ma i valori indesiderati sembrano essere disponibili all'interno della DLL (proveniente dall'oggetto C# passato). Credo che mi manca qualcosa con il marshalling di classe o un problema di memoria/puntatore. Cosa mi manca?
Modifica: Ho modificato il codice precedente per riflettere le modifiche alle definizioni metodo/funzione, in C#/C++, suggerite da Bond. Il valore (1234) che viene passato viene recuperato dal codice C# correttamente ora. Ciò ha esposto un altro problema nella DLL C++. Il valore 1234 non è disponibile per il codice C++. Invece l'oggetto ha un valore di 0 all'interno della DLL. Vorrei utilizzare le funzioni C++ predefinite per modificare l'oggetto dalla DLL. Qualsiasi altro aiuto è molto apprezzato. Grazie!
__declspec (dllexport) SetDLLObj void (CClass obj) { Holder = &obj; } sarà mal di puntatore di CClass locale in modo si può ottenere spazzatura couse di questo. – user629926
sembra che il titolare stia memorizzando il valore inserito nel codice C++ per il recupero successivo. Posso dare un'occhiata a questo, ma la mia preoccupazione principale in questo momento è tirare un valore dall'oggetto passato nella DLL. – notsodev