Ich muss einige vorhandene .NET-Logik (d. H. Assembly MyManage.dll) zu systemeigenem Code verfügbar machen, also habe ich beschlossen, C++/CLI Brücke zu erstellen. Ich habe C++/CLI-Projekt erstellt und einen Verweis auf MyManage.dll hinzugefügt. Lange Rede kurzer Sinn - es funktioniert - mir ist es gelungen, auf alles zuzugreifen, was aus nativem Code zugänglich sein sollte.C++/CLI - C# Interop - Zeichenfolge Konvertierung Speicherverlust
Aber große Ausgabe ist, dass meine Implementierung Speicher verliert. Nach Tagen des Testens und Forschens habe ich das Problem auf System::String
< ->const wchar_t
Umwandlung eingegrenzt. Schließlich habe ich ein triviales C++/CLI-Projekt erstellt, die (reproduziert) die Ausgabe zeigt:
#define EXPORTED __declspec(dllexport)
System::String^ ToManaged(const wchar_t* unmanagedString)
{
return gcnew System::String(unmanagedString);
}
const wchar_t* ToUnmanaged(System::String^ managedString)
{
return (wchar_t*) System::Runtime::InteropServices::Marshal::StringToHGlobalUni(managedString).ToPointer();
}
EXPORTED const wchar_t* __stdcall GetString(const wchar_t* dummy)
{
return ToUnmanaged(ToManaged(dummy));
}
(Wenn es nicht offensichtlich aus dem vorherigen Code ist - ich bin ziemlich neu in C++/CLI)
Wie ich bereits erwähnt habe, funktioniert der Code aber akkumuliert Speicherverbrauch, so dass es definitiv ein Leck in System::String
< ->const wchar_t
Umwandlung ist.
Meine Frage ist offensichtlich: wie zu implementieren String-Konvertierung ohne das Leck.
Danke!
Ich würde COM und COM verwenden, um die Methoden zu aktivieren, auf die Sie zugreifen müssen. Verwenden Sie tlb.exe, um das COM-Interop zu generieren. Viel weniger Kopfschmerzen. Ich ging den Cli/C++ - Pfad und entdeckte Probleme wie Dll Load Order Probleme und Virus Software Probleme zu erstellen. – CKIsLearning
@CKIsLearning - Danke für den Versuch zu helfen. Ehrlich, aus irgendeinem Grund bin ich ziemlich anti-COM orientiert. Ich würde dorthin gehen, wenn ich keine andere Lösung gefunden hätte, aber da ich inzwischen das Problem gelöst habe, gibt es keinen Grund dafür. Danke trotzdem! –
Jeder Aufruf von Marshal :: StringToHGlobalUni() ** muss ** mit einem Aufruf von Marshal :: FreeCoTaskMem() gepaart werden. Das macht Ihre ToUnmanaged() Funktion ohne Hoffnung auf eine einfache Lösung gebrochen, dieser Aufruf wird nicht passieren. Sie müssen dies neu überdenken, überlegen Sie sich einen intelligenteren String-Typ wie std :: wstring –