如何将 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<PJSONInfo>^
【讨论】:
以上是关于如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型的主要内容,如果未能解决你的问题,请参考以下文章