2009-06-28 2 views
0

Ich habe versucht, eine Sammlung von Objekten aus C# und Zugriff usig C++ über COM aber fehlgeschlagen. Ich habe versucht für List ArrayList und IDictionary alle und fehlgeschlagen.Wie Sammlungsobjekte von C# zurückgegeben werden und auf sie in C++ zugreifen?

ich habe

versucht

How to return a collection of strings from C# to C++ via COM interop auch aber nicht gelingen.

kann jede Stelle mir Hilfe

+0

Haben Sie versucht, was Earwicker vorschlägt (http://stackoverflow.com/questions/1032060/how-to-return-a-collection-of-strings-from-c-to-c-via-com-interop/ 1032356 # 1032356)? Wenn ja, was genau funktioniert nicht? – sharptooth

Antwort

0

Wie wäre es ein altmodisches Array?

public interface IManaged 
{ 
    string[] ReturnArray(); 
} 

public class Managed : IManaged 
{ 
    public string[] ReturnArray() 
    { 
     return new string[] { "A", "B", "C" }; 
    } 
} 

Tlbexp.exe mit dieser DLL-Lauf schafft eine TLB mit:

interface IManaged : IDispatch { 
    [id(0x60020000)] 
    HRESULT ReturnArray([out, retval] SAFEARRAY(BSTR)* pRetVal); 
}; 

Ich habe nicht die DLL aus nativen .exe getestet verwenden, aber es sieht vielversprechend aus :)

0

Es ist normal, dass Sie ein Objekt nicht von C# nach C++ oder von C++ nach C# übergeben können. Ein Objekt in C# ist nicht wie ein Objekt in C++. Was Sie von C# nach C++ weitergeben können, sind Typen wie bool, int und char. Achte auch auf die Größe der Typen ... zum Beispiel ist ein Zeichen in C# ein wchar_t in C++.

2

@Partial, heben Sie einen wichtigen Punkt. Sie können ein .NET-Objekt nicht an C++ übergeben (es sei denn, es handelt sich um Managed C++), da die .NET-Objekt-Semantik nicht mit der C++ - Objekt-Semantik identisch ist.

@Cute: Sie können jedoch COM Interface Pointer übergeben. Wenn Sie Ihren "traditionellen C++" -Code benötigen, um mit .NET-Objekten zu kommunizieren, verwenden Sie COM-Interfaces, keine Objekte.

Stellen Sie sicher, dass Ihr Objekt als COM-Objekt markiert ist und dass Sie eine geeignete Schnittstelle implementieren, die die von C++ benötigten Methoden enthält. Übergeben Sie dann ein Array der Schnittstellenreferenzen zurück an den C++ - Code. Der C++ - Code sollte einen SafeArray-COM-Schnittstellenzeiger erhalten, den er mit der üblichen COM-Semantik (AddRef() usw.) manipulieren kann.

+0

Cn du gibst mir ein Stück Code, um eine Idee zu bekommen. I Hav verwendet IDictionary auch eine genrische Schnittstelle aber filaed, um Werte in C++ zu erhalten – Cute

Verwandte Themen