2016-06-17 18 views
-1

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?

+0

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

+0

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

+0

Versuchen Sie mit '[Out, MarshalAs (UnmanagedType.LPStr)]' vor dem Ausgabeparameter – bob1024

Antwort

1

Da der Typ ist char * für den zweiten Parameter und die DLL-Funktion in dem Puffer füllen, die die C# Erklärung wie folgt sein sollte übergeben wird:

[MarshalAs(UnmanagedType.LPStr)]System.Text.StringBuilder output

+0

Genau so ist es in der Frage erklärt. Das kann nichts ändern. –