C#托管方式调用c++动态库与字符串传输(由String 转 char*)
C#托管方式调用c++动态库与字符串传输(由String 转 char*)
- 托管库生成:
工程属性设置如下
编程如下,其中字符串传输需要经过转换有system string 转为 char*, 因为此种模式下system中的string在c++和c#为通用格式。
using namespace std;
using namespace cv;
using namespace System;
using namespace Runtime::InteropServices;
public ref class demoClass
{
public:
demoClass(void);
~demoClass(void);
float version;
int demosampA(System::String^ A_path);
};
demoClass::demoClass(void)
{
}
demoClass::~demoClass(void)
{
}
int demoClass::demosampA(System::String^ A_path)
{
int f=0;
char* Ipath = (char*)(void*)Marshal::StringToHGlobalAnsi(A_path); //字符串传输
cv::Mat img = imread(Ipath);
//#............code..................
return f;
}
2,调用动态库:
在引用栏添加demo.dll单击工程References 选项—— Add Reference 选项
在弹出的属性框中在库所在目录选择demo.dll单击OK
//调用程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace LibtestDemo
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
string imge = @"t.jpg";
int Res = 0;
demoClass demo1 = new demoClass(); //实例对象
Res = demo1.demosampA(imge);
MessageBox.Show(Res + "");
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
3,如果在库生成时,并未进行字符串转换,可以在调用时使用如下方法转换并调用
工程属性勾选允许不安全代码
(1),鼠标左击工程点击列表中Properties选项
(2)在弹出属性框中勾选 Allow unsafe code
在引用栏添加demo.dll
单击工程References 选项—— Add Reference 选项
在弹出的属性框中在库所在目录选择demo.dll单击OK
在C#中的调用示例如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace LibtestDemo
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
string img = "t.jpg"; //目标图像路径
int Res = 0; //结果
demoClass demo1 = new demoClass(); //实例对象
sbyte[] IArray = (sbyte[])((Array)System.Text.Encoding.Default.GetBytes(img)); //用这行代码将字符串转为sbyte[]型
unsafe
{
fixed(sbyte* pI = IArray)
{
Res = demo.demosampA(pI);
}
}
MessageBox.Show(Res + "");
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
版权声明:本文为博主原创文章,转载请联系作者取得授权。https://blog.****.net/qq_34106574