C#使用C+中的函数+;以std::vector作为参数的dll 我有一个C++ DLL,其中一个函数以 STD::vector < /代码>作为参数。我想在C#应用程序中使用此API,但我不确定这是否可行 我的C++函数: EXPORT_API void STACKMODE ConfigurationStream(InterfaceManager * inst, std::vector<UInt16> address, std::vector <UInt16> data); EXPORT\u API void STACKMODE配置流(InterfaceManager*inst,std::vector address,std::vector data);

C#使用C+中的函数+;以std::vector作为参数的dll 我有一个C++ DLL,其中一个函数以 STD::vector < /代码>作为参数。我想在C#应用程序中使用此API,但我不确定这是否可行 我的C++函数: EXPORT_API void STACKMODE ConfigurationStream(InterfaceManager * inst, std::vector<UInt16> address, std::vector <UInt16> data); EXPORT\u API void STACKMODE配置流(InterfaceManager*inst,std::vector address,std::vector data);,c#,c++,stdvector,C#,C++,Stdvector,是否有某种方法可以从C#发送列表或数组,或者我是否应该将API调用更改为有两个数组,其中包含一个额外的int参数作为数组的大小。请注意,这两个向量的大小总是相同的。您不能直接这样做,因为dotnet框架中没有与std::vector完全相同的内存布局。 但如果您将API更改为(正如您在问题中所问的那样),您可以这样做: 只能调用C参数类型的方法,其中C++的一个函数采用STD::vector作为参数——注意,即使在C++中,使用这样的函数也不容易。您必须确保调用该函数的人使用完全相同的std::

是否有某种方法可以从C#发送列表或数组,或者我是否应该将API调用更改为有两个数组,其中包含一个额外的
int
参数作为数组的大小。请注意,这两个向量的大小总是相同的。

您不能直接这样做,因为dotnet框架中没有与std::vector完全相同的内存布局。 但如果您将API更改为(正如您在问题中所问的那样),您可以这样做:


只能调用C参数类型的方法,其中C++的一个函数采用STD::vector作为参数——注意,即使在C++中,使用这样的函数也不容易。您必须确保调用该函数的人使用完全相同的
std::vector
实现、相同的编译器、相同的编译器设置等。这是根本不同的,因为它为
ConfigurationStream
函数提供了对调用方
地址
数据
的读/写访问权,而在OP的C++版本中,函数接收传入的向量的自己的深层副本。如果代码“>配置流”/CODEL需要修改(例如排序/过滤)地址/数据而不改变调用方的版本,这可能是故意的,但这也是C++程序员的常见疏忽。如果不需要深度副本,函数参数应该是
const std::vector&
s。好的,你真的想要副本吗?我不这么认为。直接复制是不可能的,因为std::vector只是动态数组的包装器。。。要复制它,需要执行堆分配。。。
EXPORT_API void STACKMODE ConfigurationStream(
    InterfaceManager * inst
   , uint16_t* addressPtr
   , uint16_t* dataPtr
   , int32_t  cnt
);