Come restituire una raccolta di stringhe da C # a C ++ tramite interoperabilità COM

Ho creato un componente per alcuni metodi di visualizzazione in C # restituisce una lista di stringhe

come mostrato di seguito. In v ++ ho usato std :: lst per catturare il valore restituito da Disp () ma esso

dà al compilatore l’errore che Disp non è un membro della class. Allora restituisco il tipo di reso vuoto

funziona bene cosa posso modificare in modo che Disp restituisca una lista e in main (c ++) che devo usare

questo valore di ritorno.

Public interface ITest { List Disp(); } class TestLib:ITest { List Disp() { List li=new List(); li.Add("stack"); li.Add("over"); li.Add("Flow"); return li; } } 

compilato e creato Test.dll correttamente e anche test.tlb. Ora nella funzione principale che è scritta in c ++

 #include #import "..\test.tlb" using namespace Test; void main() { HRESULT hr=CoInitialize(null); ITestPtr Ip(__uuidof(TestLib)); std::list li=new std::list(); li=Ip->Disp(); } 

Cosa c’è di sbagliato nel mio codice quando provo a compilare questo mostra

‘Disp’: non è un membro di TestLib: ITest

come risolvere questo plz help me …. quando lo faccio restituire il tipo come void in Class funziona bene .che errore ho fatto ????

Questo non funzionerà, anche se correggi gli errori di battitura. L’interoperabilità COM non ha una mapping standard da List a qualcosa in COM e certamente non la std::list a std::list . I generici non possono apparire nelle interfacce COM.

AGGIORNARE

Ho provato ad usare ArrayList come tipo di ritorno, in quanto non generico pensavo che forse il tlb includesse informazioni sul tipo per esso. Non ha funzionato, quindi ho provato IList . Anche questo non ha funzionato (l’affermazione #import prodotto un file .tlh che si riferiva a IList ma non ne aveva una definizione.)

Quindi, come soluzione alternativa, ho provato a dichiarare un’interfaccia di elenco semplice. Il codice finisce così:

 [Guid("7366fe1c-d84f-4241-b27d-8b1b6072af92")] public interface IStringCollection { int Count { get; } string Get(int index); } [Guid("8e8df55f-a90c-4a07-bee5-575104105e1d")] public interface IMyThing { IStringCollection GetListOfStrings(); } public class StringCollection : List, IStringCollection { public string Get(int index) { return this[index]; } } public class Class1 : IMyThing { public IStringCollection GetListOfStrings() { return new StringCollection { "Hello", "World" }; } } 

Quindi ho una mia (molto semplicistica) interfaccia per la raccolta di stringhe. Si noti che la mia class StringCollection non deve definire la proprietà Count perché eredita perfettamente da List .

Poi ho questo sul lato C ++:

 #include "stdafx.h" #import "..\ClassLibrary5.tlb" #include  #include  using namespace ClassLibrary5; int _tmain(int argc, _TCHAR* argv[]) { CoInitialize(0); IMyThingPtr thing(__uuidof(Class1)); std::vector vectorOfStrings; IStringCollectionPtr strings(thing->GetListOfStrings()); for (int n = 0; n < strings->GetCount(); n++) { const char *pStr = strings->Get(n); vectorOfStrings.push_back(pStr); } return 0; } 

Devo copiare manualmente il contenuto della collezione di stringhe come un normale contenitore standard C ++, ma funziona.

Potrebbe esserci un modo per ottenere informazioni di tipo corrette dalle classi di raccolta standard, in modo da non dover creare interfacce di raccolta personalizzate, ma in caso contrario, dovrebbe funzionare correttamente.

In alternativa, hai guardato C ++ / CLI? Ciò funzionerebbe senza problemi, anche se non convertirà automaticamente le raccolte CLR in contenitori standard.

Sembra che ci siano diversi errori di battitura. Nel C # si dichiara una class chiamata TestLib, ma si sta tentando di build un TestCls. Inoltre, né la class né il metodo sono pubblici (che dovrebbe essere un errore di compilazione almeno su Disp, poiché l’interfaccia deve essere implementata pubblicamente).

Indovina: Disp () non è dichiarato pubblico