如何 DllImport char*
How to DllImport char*
我有一个像这样的 C++ 函数:
myExport.h
extern "C" { __declspec(dllexport) const int Run(char *input, char *output, int *length); }
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()] = '[=11=]';
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();
}
但是,输出缓冲区总是空的。我做错了什么?
由于第二个参数的类型是char *
,DLL函数会填充传递过来的缓冲区,C#声明应该如下:
[MarshalAs(UnmanagedType.LPStr)]System.Text.StringBuilder output
我有一个像这样的 C++ 函数:
myExport.h
extern "C" { __declspec(dllexport) const int Run(char *input, char *output, int *length); }
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()] = '[=11=]';
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();
}
但是,输出缓冲区总是空的。我做错了什么?
由于第二个参数的类型是char *
,DLL函数会填充传递过来的缓冲区,C#声明应该如下:
[MarshalAs(UnmanagedType.LPStr)]System.Text.StringBuilder output