Ich habe eine C++ Funktion wie folgt aus:Wie DllImport char *
myExport.h
myExport.cpp
const int Run(char *input, char *output, int *length) {
std::ostringstream value;
value
<< "FOO" << "|"
<< "BAR" << "|";
auto str = value.str();
auto i = stdext::checked_array_iterator<char*>(output, str.length());
std::copy(str.begin(), str.end(), i);
output[str.length()] = '\0';
return 1;
}
Und in C# ich habe:
myImport.cs
[DllImport("MyExport.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int Run(
[MarshalAs(UnmanagedType.LPStr)]string input,
StringBuilder output,
ref int length);
public static string Execute(string input)
{
var length = 1024;
var output = new StringBuilder(1024);
var result = Run(input, output, ref length);
return output.ToString();
}
Jedoch ist der Ausgangspuffer immer leer. Was mache ich falsch?
Haben Sie, dass Ihre C++ Funktion Arbeiten bestätigen richtig, indem Sie einen Test gegen eine andere C- oder C++ - Anwendung ausführen? Sie haben nicht angegeben, welche Seite des Zauns nicht funktioniert, die DLL-Seite oder die C# -Seite. – PaulMcKenzie
Ein Zeichen in C++ ist ein Byte breit, während ein Zeichen in C# je nach Codierung ein/zwei Zeichen breit ist. MarshalAs (UnmanagedType.LPStr) ist korrekt für die Eingabe, sollte aber auch für die Ausgabe verwendet werden. Stringbuilder funktioniert nicht. – jdweng
Versuchen Sie mit '[Out, MarshalAs (UnmanagedType.LPStr)]' vor dem Ausgabeparameter – bob1024