(gelöst) C++ CLI => C#

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
joggel

(gelöst) C++ CLI => C#

Beitrag von joggel »

Hallo,

mal wieder stehe ich hier von einem kleinen Problem.
Ich habe eine C++-Bibliothek. Diese möchte ich nach C# portieren.
Ich wrappe diese C++-Klasse also in eine C++ CLI Klasse.

Ich poste hier einfach mal etwas Code, weil es mehr sagt als 1000 Worte.

Code: Alles auswählen

void MYWrapper::getItemNames(array<String^>^ strings)
{
	CAtlArray<CString> itemNames;
	mImpl->getItemNames(itemNames);

	strings = gcnew array<String^>(itemNames.GetCount());
	for (int index = 0; index < itemNames.GetCount(); ++index)
	{
		String^ str = gcnew String(itemNames.GetAt(index));
		strings[index] = str;
	}
}
Ich möchte diese getItemNames gerne in C# aufrufen, quasi so:

Code: Alles auswählen

            string[] strings = new string[10];
            wrapper.getItemNames(strings);
Leider ist jeder string in strings leer.
Wenn ich jedoch debugge, dann wird auf C++ CLI Seite das array schon korrekt befüllt, es kommt nur nix auf C#-Seite an *<:-/
Weiß da jemand was?
Zuletzt geändert von joggel am 06.10.2016, 10:42, insgesamt 1-mal geändert.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: C++ CLI => C#

Beitrag von xq »

Dein Code ist das C#-Äquivalent zu:

Code: Alles auswählen

void MYWrapper.getItemNames(string[] strings)
{
        CAtlArray<CString> itemNames;
        mImpl->getItemNames(itemNames);

        // Argument wird überschrieben:
        strings = new string[itemNames.GetCount()];
        for (int index = 0; index < itemNames.GetCount(); ++index)
        {
                var str = new string(itemNames.GetAt(index));
                strings[index] = str;
        }
}
Einfach in C++ das mit gcnew erzeugte array zurückliefern und jut:

Code: Alles auswählen

array<String^>^ MYWrapper::getItemNames()
{
        CAtlArray<CString> itemNames;
        mImpl->getItemNames(itemNames);

        auto strings = gcnew array<String^>(itemNames.GetCount());
        for (int index = 0; index < itemNames.GetCount(); ++index)
        {
                String^ str = gcnew String(itemNames.GetAt(index));
                strings[index] = str;
        }
        return strings;
}
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
joggel

Re: C++ CLI => C#

Beitrag von joggel »

Wunderbar. Funktioniert (y)
Danke :)
Antworten