如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型

Posted

技术标签:

【中文标题】如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型【英文标题】:How do I convert System::^array from a C# function to a equivalent datatype in C++ 【发布时间】:2020-12-08 13:48:27 【问题描述】:

我有一个结构数组System::^ array 正在填充C# DLL。需要将该结构数组导出到C++ Dll(在函数中),并且应该在我的进一步C++ DLL 中使用该导出数组。

以下是填充 Array 结构的 C# 代码 (ReturningJSONArray)。

namespace JSON
 
  public struct PJSONInfo
  
    string sSetting;
    double dMinVal;
    double dMaxVal;
    string sUnits;
  

  public interface iCalFunction
    PJSONInfo[] ReadJSON(); 

  public  class JSONReaderClass : iCalFunction
   
    public PJSONInfo[] ReadJSON()
    
      ILIST<PJSONInfo> JSONList = new List<PJSONInfo>();
       ..
       ..//(Fill the Ilist of PJSONInfo)
       ..
      PJSONInfo[] ReturningJSONArray = JSONList.ToArray();
      return ReturningJSONArray ;
    
   

ReturningJSONArray 是从 C# sn-p 返回的结构数组。)

以下是 C# 函数作为 DLL 链接到的 C++ 代码。

class CReadingClass

  public :msclr::auto_gcroot<JSONReaderClass ^> pJSONClass;


int ReadJSONFromJSONReader()

  CReadingClass* pReadClass;
  pReadClass = new CReadingClass();
  pReadClass ->pJSONClass =gcnew JSONReaderClass ();
  System::Array^ JSONSetting = pReadClass -> pJSONClass -> ReadJSON();
  //**JSONSetting** is a system::Array type of C# ,
  return 1;

JSONSetting 是 C# 的 system::Array 类型,如何将其转换为与 C++(或等效数据类型)兼容的内容。 我尝试将其转换为结构向量,但似乎应该进行一些转换(编组),有人可以对此进行详细说明,还是有其他解决方法。

【问题讨论】:

固定并复制到PJSONInfo*。搜索pin_ptr “C++”代码看起来更像 C++/CX(为 WinRT 生成本机程序集)或 C++/CLI(为 .NET VM/CLR 生成 MSIL)。 C++/CX 取代了 WRL; C++/CX 被 C++/WinRT(标准 C++17 和 Kenny Kerr 的模板库)取代。 【参考方案1】:

您的PJSONInfo 结构不是blittable,因为它包含字符串。因此,您需要声明相应的非托管类型并手动转换每个值。 Double 转换起来很简单,但请参阅 converting c# strings to std::string 了解如何转换字符串。将转换后的值放在 c 数组或 std::vector 中,具体取决于您的需要。

此外,您应该能够在 c++/cli 中使用泛型数组,即System::Array&lt;PJSONInfo&gt;^

【讨论】:

以上是关于如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型的主要内容,如果未能解决你的问题,请参考以下文章

C# 遍历枚举? (索引 System.Array)

如何将数据从非托管应用程序传递到 C# COM DLL

c# System.Array

如何反转 Array.Sort 的方向 - C#

在 ASMX C# Web 服务中使用 System.Array 类型的参数定义函数

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?