C#对于C++进行传参的类型修正

混合编程的参数传递

1.有时候项目会要求不同语言所编译出来的文件进行联动工作,如C# 中将字符串/实数/整数等变量传送到.PY文件中,进行计算,就会涉及到参数传递

2.我常用的方法是,先建立一个C++项目CPPDLL,在C++中调用python。

2.1 由于Python文档中对于C++/C混合编程说明的很清晰。这部分我先鸽掉不写,可以先看这里.

2.2 以及将C++中的变量传递到python中,参数传递.

2.3 还有C++调用python后封装成DLL供C#使用,这里我先鸽掉。

3.由于2解决了C++到python的参数传递,那么我们要解决的就是从C#中到C++的参数传递。

3.1 坑点在于C#的string 和 String 这两个类型是同C++的string是不等价的,如果你将C#的参数传进了你创造的CPPDLL类中的静态函数中,会报一个很复杂的错误 = =,看不出来是类型转换的问题。所以解决方式是,利用C#中的System.Runtime.InteropServices里的Marshal类的转换方法去转换

3.1.1 C++对于python传递的参数是字符串指针(const char*),对于C#中将C#的string类型转换为IntPtr 指针类型传进C++的函数中。

//将"GY"字符串转换为IntPtr类型传参至C++中
 string a = "GY";	
 IntPtr res = Marshal.StringToHGlobalAnsi(a);

这样还不够,还要修改CPPDLL方法,将其参数类型写为IntPtr

public static extern void start(IntPtr a);  //c#的CPPDLL类

即使在C++中,该函数原型为

extern "C" _declspec(dllexport) void start(const char* s)

所以结论是C# -> C++ 中 InPtr 可以对等const char*
使用方法为

string a = "GY";
IntPtr res = Marshal.StringToHGlobalAnsi(a);
CPPDLL.start(res);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值