一、方法的封装与调用
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);
}