混合编程的参数传递
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);