C#调用C++ DLL 中定义的函数

公司的系统主要是用c#实现的,现在要用到其他公司编写的接口,用c++实现,因此涉及到c#调用c++的部分,已成功调用,现用个简单的例子记录实现过程

创建c++ dll

struct  Person
{
	char name[5];
	int age;
};

extern "C" __declspec(dllexport) Person* Test()
{
	Person* p= new Person;
	strcpy_s(p->name, "beck");
	p->age = 32;
	
	return p;
}

将此代码编译为dll, vs 2013中, 右键项目->属性,常规中将目标文件扩展名和配置类型改为"dll"

编译好后将生成的dll复制到c#的运行目录下


c#程序调用dll

定义c#中和c++对应的结构体

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    struct Person
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
        public string name;
        public int age;
    }

属性
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
表示此结构体在内存中是顺序布局,编码为ansi

定义外部方法

       [DllImport("InvokeStructSample.dll")]
        public static extern IntPtr Test();

注意返回类型为IntPtr,是一个指针, 而非直接的Person结构体, 这里我卡了很久,是因为对两边机制的理解不深导致。 如果直接返回Person, Person中纸包含简单类型(int,doule之类的)不会有问题,但如果包含复杂类型(string, 数组之类的) 则会报 "方法的签名与pinvoke不兼容" 的错误, 之前一直在c#结构体的属性上找出路,没成功,故而改为指针的形式。

调用:

            IntPtr pPerson = Test();
            Person p = (Person) Marshal.PtrToStructure(pPerson, typeof(Person));
            Console.WriteLine(p.name);
            Console.WriteLine(p.age);

执行,调用成功!!


另外,如果函数中需要传递结构体, c++中传结构体的指针, c#中是将参数定义为IntPtr,然后调用时用StructureToPtr()方法将结构体转成IntPtr,传入调用。



这个问题折腾了我一天,终于解决了,这样就可以让c#顺利调用用c++实现的函数了。希望能对同样困扰于此的小伙伴有所帮助

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值