2016-06-17 7 views
-1

私はこのようなC++機能: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; 
} 

そして、C#で、私が持っています:

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(); 
} 

しかし、出力バッファは常に空です。私は間違って何をしていますか?

+0

あなたはC++の機能が動作することを確認しました別のCまたはC++アプリケーションに対してテストを実行することによって正しくですか?あなたはフェンスのどちら側が動作していないか、DLL側かC#側かを指定していません。 – PaulMcKenzie

+0

C++の文字は1バイト幅ですが、c#の文字はエンコードに応じて1/2文字幅です。 MarshalAs(UnmanagedType.LPStr)は入力には正しいですが、出力にも使用する必要があります。 Stringbuilderは動作しません。 – jdweng

+0

出力パラメータ – bob1024

答えて

1

タイプが2番目のパラメータのchar *で、DLL関数が渡されたバッファに入力されますので、以下のように、C#の宣言は次のようになります。

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

+0

これは、それが質問で宣言されているとおりです。これは事を変更することはできません。 –

関連する問題