-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();
}
しかし、出力バッファは常に空です。私は間違って何をしていますか?
あなたはC++の機能が動作することを確認しました別のCまたはC++アプリケーションに対してテストを実行することによって正しくですか?あなたはフェンスのどちら側が動作していないか、DLL側かC#側かを指定していません。 – PaulMcKenzie
C++の文字は1バイト幅ですが、c#の文字はエンコードに応じて1/2文字幅です。 MarshalAs(UnmanagedType.LPStr)は入力には正しいですが、出力にも使用する必要があります。 Stringbuilderは動作しません。 – jdweng
出力パラメータ – bob1024