包装本机C++;在.dll中具有多个输出的函数,用于C# 我在C++/CLI.DLL中封装了一些本地C++代码,用于.NET项目中——主要是C++。电话的数量将是巨大的,所以我希望以一种有效的方式做到这一点。我正在包装的函数采用以下参数: int SomeFun( const char* input_text, int* output_array, bool* output_value);

包装本机C++;在.dll中具有多个输出的函数,用于C# 我在C++/CLI.DLL中封装了一些本地C++代码,用于.NET项目中——主要是C++。电话的数量将是巨大的,所以我希望以一种有效的方式做到这一点。我正在包装的函数采用以下参数: int SomeFun( const char* input_text, int* output_array, bool* output_value);,.net,c++-cli,wrapper,unmanaged,managed,.net,C++ Cli,Wrapper,Unmanaged,Managed,我知道如何高效地将System::String转换为const char*正是因为这样。我的问题是: 函数需要指向output\u array和output\u value的指针,这些指针需要在包装器中创建/清理并返回到托管组件。我该怎么做 如何使用结构作为返回值,从wrapper.dll向托管环境返回多个值 目前,我正在尝试在wrapper.dll中执行所有指针处理和托管/非托管交互,但是(解决方案3)建议在C#中使用“不安全”环境是最快的。对于我正在尝试做的事情,这可能是一个更好的选择吗?我

我知道如何高效地将
System::String
转换为
const char*
正是因为这样。我的问题是:

  • 函数需要指向
    output\u array
    output\u value
    的指针,这些指针需要在包装器中创建/清理并返回到托管组件。我该怎么做
  • 如何使用结构作为返回值,从wrapper.dll向托管环境返回多个值
  • 目前,我正在尝试在wrapper.dll中执行所有指针处理和托管/非托管交互,但是(解决方案3)建议在C#中使用“不安全”环境是最快的。对于我正在尝试做的事情,这可能是一个更好的选择吗?我想这会使包装不那么复杂,但也需要在C#中进行更精细的处理
  • 谢谢


    /David

    您可以使用与固定字符串相同的方式固定数组,例如,对于字节[]:

    pin_ptr<Byte> ptrBytes = &myArray[myArray->GetLowerBound(0)];
    
    pin_ptr ptrBytes=&myArray[myArray->GetLowerBound(0)];
    
    ptrBytes现在可以用作无符号字符*

    您也可以固定来自C#的单个变量,例如,使用一个参数,该参数是对一个名为int%ival的int的引用:

    pin_ptr<int> pInt =   &ival;
    
    pin_ptr pInt=&ival;
    
    品脱现在可以用作整数*

    您可以使用gcnew创建数组,例如创建一个字节数组以返回到C#:

    array^streambuf=gcnewarray(bufSize+16);
    

    现在可以用StRuBuf[index ]填充这个,在循环中重新打包C++数组,或者在返回到C时,将其插入并执行MeMCPY。

    我通常不返回结构。我通常在C++/CLI函数包装器中定义每个参数。例如,如果一个结构有两个int和一个字符串,我会使用ref关键字(%在C++/CLI中,例如int%ival)使每个int都成为一个参数。如果必须返回大量值,则最容易返回使用gcnew创建的类,而不是结构


    如果您试图加快阵列访问速度,那么使用不安全代码是一种方法,而您的C#代码将非常简单。如果你已经有C++代码,它使用STL,而且非常复杂,你不想重写它,特别是如果你有很多指针算法和强制转换,坚持使用C++ /CLI包装器。这个函数非常不安全,它无法告诉它数组有多大。如果传递给它的数组太小,则该函数将损坏内存。阿瑞斯阿凡达,谢谢你的回复。我会查一查/DavidOk,我在C中的调用看起来像
    包装器(输入文本、引用输出数组、引用输出值)
    。C++/CLI包装采用
    包装(字符串^input\u text,数组^%output\u数组,bool%output\u值)
    。在包装器中,我将输入_文本视为,并执行
    pin_ptr pOutput_数组=&output_数组[0];int*npOutput\u array=pOutput\u array
    对于布尔值
    pin\ptr pOutput\u值=&Output\u值;bool*npOutput\u value=pOutput\u value
    。它能工作-这样行吗?我应该在退出之前销毁pin_ptr和本机指针吗?谢谢,看起来都对。不要试图破坏固定指针——CLI会为您这样做。当它们超出作用域时将被取消固定,如果您试图删除它们,则会导致内存损坏。
    array<Byte>^ streambuf = gcnew array<Byte>(bufSize+16);