C#调用非托管C++生成的DLL文件

一、方法的封装与调用
1、C++:
在Test.cpp文件中添加如下内容:

extern "C" _declspec(dllexport) int Add(int a, int b)
{
    return a + b;
};

生成DLL。
2、C#:
在C#类中封装如下方法:

[DllImport("Test.dll", EntryPoint = "Add", CharSet = CharSet.Auto)]
public static extern int Add(int a, int b);

入口的名称必须和C++的函数名保持一致,不然无法找到入口点。且C++生成的DLL与C#调用的工程的输出目录必须保持一致。
二、类的封装与调用
1、C++:
在Test.h文件中添加如下内容:

class Student 
{
    private:
        int m_Id;
        char* m_Name;
    public:
        Student(int id, char* name)
        {
            m_Id = id;
            m_Name = name;
        }

        virtual ~Student() { }

        int GetId() { return m_Id; }
        char* GetName() { return m_Name; }
};

在Test.cpp文件中添加如下内容:

#include "stdafx.h"
#include "malloc.h"
#include <string>
#include "Test.h"

typedef struct 
{
    int id;
    char name[20];
} _Student;

extern "C" __declspec(dllexport) _Student* Create(int id, char* name)
{
    _Student* std = (_Student*)malloc(sizeof(_Student));
    Student* student = new Student(id, name);
    std->id = student->GetId();
    strcpy(std->name, student->GetName());
    if (student)
    {
        delete student;
        student = NULL;
    }
    return std;
}

生成DLL。
2、C#:
在C#类中封装如下方法:

[StructLayout(LayoutKind.Sequential)]
public struct Student
{
    public int Id;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public string Name;
}

[DllImport("Test.dll", EntryPoint = "Create", CharSet = CharSet.Ansi)]
public static extern IntPtr Create(int id, string name);

调用:

static void Main(string[] args)
{
    IntPtr ptr = Create(10001, "XZ");
    Student student = (Student)Marshal.PtrToStructure(ptr, typeof(Student));
    Console.WriteLine("ID: {0}, Name: {1}", student.Id, student.Name);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值