C#调用C++dll传递结构体数组并修改内容

火星大能猫 2013-10-31 11:20:59

struct CalcParm
{
double m_dRlu;
double m_dConc;
};
extern "C" _declspec(dllexport) int TestFunc(CalcParm* arr)
{
CalcParm aa;
aa.m_dConc= 333;
aa.m_dRlu =5555;
arr[0]= aa;
return 10;
}

extern "C" _declspec(dllexport) int TestFunc2(int* arr)
{
arr[0]=10;
return 10;
}

如上所示,写了两个简单的测试方法
TestFunc1和TestFunc2

[DllImport("CalcHelper.dll")]
public extern static int TestFunc1(ref CalibrationStandardPoint arr);

[DllImport("CalcHelper.dll")]
public extern static int TestFunc2(ref int arr);

//声明结构体
/// <summary>
/// 发光值-浓度值结构体
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class CalcParm
{
public double m_dRluValue; //发光值
public double m_dConcentration; //浓度
};
//测试调用
int[] arr =new int[3];
TestFunc2(ref arr[0]);
//↑该方法测试通过,并且修改成功
CalcParm[] arr2 =new CalcParm[3];
TestFunc2(ref arr2);//运行结束后报错

但是,如果只是传参绝对没问题,如果我要修改又不像通过return返回的话,应该怎么做?


...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2013-10-31
  • 打赏
  • 举报
回复
另外: [StructLayout(LayoutKind.Sequential)] public struct CalcParm { public double m_dRluValue; //发光值 public double m_dConcentration; //浓度 };
gomoku 2013-10-31
  • 打赏
  • 举报
回复
为什么不延续你成功的做法呢? int[] arr =new int[3]; TestFunc2(ref arr[0]); //↑该方法测试通过,并且修改成功 CalcParm[] arr2 =new CalcParm[3]; TestFunc2(ref arr2[0]);
devmiao 2013-10-31
  • 打赏
  • 举报
回复
你要在哪一头修改。 C#的话,可以使用callback。
火星大能猫 2013-10-31
  • 打赏
  • 举报
回复
TestFunc2(ref arr2[0]);这里原来是也是这么写的,不过提问的时候笔误罢了. 1,4楼都正确 原来C#里的struct和c++不同 怪不得出问题!!!! 关键还是struct 结贴.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧