Meine Frage ist ein wenig allgemein, also bin ich nicht für eine exakte Antwort suchen, aber möglicherweise einige Richtungen zu prüfen, dass mir helfen ...C# DllImport Probleme
An meinem Arbeitsplatz I-Programm vor allem in C#. Wir haben diese 3rd-Party-Firma, mit der wir arbeiten, die uns eine native C++ - DLL gab, die wir verwenden müssen. Da die C++ - Methode, die ich brauchte, nicht in einer Weise offengelegt wurde, die leicht aus C# referenziert werden konnte, habe ich die DLL in eine andere Native C++ - DLL geschrieben.
So jetzt habe ich 2 Native C++ dlls, eine die andere Verpackung.
Ich habe eine kleine C# -Konsolenanwendung erstellt, die die Methode aufruft, die ich in C++ erstellt habe. Meine Methode Signatur wie folgt aussieht:
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
In meiner Konsolenanwendung, funktioniert alles in Ordnung, und ich immer die Zeichenfolge im im Ergebnis erwartet erhalten.
Aber wenn ich es zu einem Webdienst oder einer Webanwendung verschiebe, die ich erstellt habe (da dies ist, wo ich es wirklich brauche), sehe ich, dass die Zeichenfolge im Empfangen ist Müll und nicht einmal konsistent. Es scheint, als würde ich nur einen Verweis auf Speicher bekommen, der verloren ist oder so etwas, aber das ist nur eine Vermutung von mir ...
Ich weiß nicht, warum das passiert, da in meiner Konsolenanwendung alles funktioniert fein.
Hat eine Richtung jemand, der mir helfen könnte ??? ...
Vielen Dank im Voraus, gillyb
Edit: ich dachte, es könnte mit einigen nicht fixierten Objekten zu tun haben, Also habe ich versucht, die Methode in einer festen Anweisung, etwa wie folgt aufzurufen:
... aber das tat es immer noch nicht für mich. Ist das der richtige Weg, um Objekte zu fixieren?
2. Edit: Die Methodensignatur in C++ wie folgt aussieht:
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
3. Edit: ich die Signatur der Methode
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
und die geändert werden Rückgabewert, den ich suche, wird in den Parameter *hashPass
gesetzt.
Jetzt habe ich eine einfache Konsolenanwendung erstellt, um es zu testen. Wenn ich den DllImport in meine Hauptklasse einfüge und direkt die Methode aufruft, funktioniert alles super, aber wenn ich den DllImport verschiebe und die Methode in eine andere Klasse bringe und diese Klasse über die 'Main'-Methode der Konsole aufruft, bekomme ich eine StackOverflow-Ausnahme!
Wer hat irgendwelche Ideen, warum das passiert?
Können Sie uns zeigen, wie der Funktionsheader in C/C++ deklariert wird. Das könnte helfen :) –
Töte den API-Autor, es ist ein sehr klares Speicherleck passiert ... – leppie
Warum ??? Kannst du bitte erklären warum und warum ist das so klar von der Signatur? Hoffentlich können wir es noch reparieren! – gillyb