我正在将一些本地c++代码包装在c++/CLI .dll中,以便在。net项目中使用——主要是c#。电话的数量将会很大,所以我希望以一种有效的方式做到这一点。我包装的函数接受以下参数:
int SomeFun(
const char* input_text,
int* output_array,
bool* output_value);
我知道如何做一个有效的System::String
到const char*
转换感谢这个答案。我的问题是:
- 该函数期望指向
output_array
和output_value
的指针,这些指针需要在包装器内创建/清理并返回给托管组件。我怎么做呢? - 我如何从包装器.dll返回多个值到托管环境-通过使用结构体作为返回值?
- 现在我正试图在包装器。dll中做所有的指针处理和托管/非托管交互,但这篇文章(解决方案3)建议在c#中使用"不安全"的环境是最快的。对于我想做的事情来说,这可能是一个更好的选择吗?我想这会使包装器不那么复杂,但也需要在c#中进行更精细的处理。
谢谢,大卫
/
可以像固定字符串一样固定数组,例如:对于byte[]:
pin_ptr<Byte> ptrBytes = &myArray[myArray->GetLowerBound(0)];
ptrBytes现在可以用作unsigned char*
您也可以固定来自c#的单个变量,例如,使用一个称为int% ival的int型参数:
pin_ptr<int> pInt = &ival;
pInt现在可以用作int*
你可以用gcnew创建数组,例如创建一个Bytes数组返回给c#:
array<Byte>^ streambuf = gcnew array<Byte>(bufSize+16);
你现在可以用streambuf[index]填充它,在一个循环中重新包装一个c++数组,或者你可以在将它返回到c#之前固定它并做一个内存占用。
通常不返回结构体。我通常在c++/CLI函数包装器中定义每个参数。例如,如果一个结构体有两个int型和一个字符串,我会用ref关键字将每个结构体都作为参数(c++/CLI中的%,例如int% ival)。如果你必须返回大量的值,最简单的方法是返回一个用gcnew创建的类,而不是一个结构体。
使用不安全的代码是一种方法,如果你试图加快数组访问,你的c#代码将是直接的。如果你已经有了c++代码,它使用STL,非常复杂,你不想重写它,特别是如果你有很多指针算术和类型转换,坚持使用c++/CLI包装器。