记录一下两个内容:
1.使用VS2015创建C++ DLL;
2.使用C#调用上面创建好的C++ DLL;
一.使用VS2015创建C++ DLL
1.选择win32项目
2.点击【下一步】->选择 dll 和预编译头
3.随便添加一个头文件【MyTester.h】:
并在stdafx.h文件中添加引用:
随便输入一些简单定义代码,这里以 struct / int / bool / char /BYTE 类型做些例子:
// CppTester.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
//相机设置
typedef struct CameraSetting
{
int Setting1;
bool Setting2;
char Setting3[20];
};
//相机
typedef struct Camera
{
int CameraId;
char CameraName[20];
CameraSetting Setting;
};
//相机图片
typedef struct CameraImageData
{
public:
int CameraId;
char CameraName[20];
BYTE Image[50000];
CameraSetting Setting;
};
//更新相机设置
extern "C" _declspec(dllexport) void __stdcall UpdateCameraSetting(Camera& camera,CameraSetting& cameraSetting);
//获取相机传回的图片
extern "C" _declspec(dllexport) int __stdcall GetCameraImageData(CameraImageData& cameraImageData);
4.添加头文件对应的cpp文件【MyTester.cpp】:
#include "stdafx.h"
void __stdcall UpdateCameraSetting(Camera& camera, CameraSetting& cameraSetting)
{
Camera currentCamera = camera;
currentCamera.Setting = cameraSetting;
}
int __stdcall GetCameraImageData(CameraImageData* cameraImageData)
{
CameraImageData* currentData = cameraImageData;
currentData->CameraId = 3;
strcpy(currentData->CameraName, "camera3");
currentData->Image[0] = 3;
currentData->Image[1] = 3;
currentData->Image[2] = 3;
return 0;
}
5.添加模块定义文件:
在模块文件中输入:
二.使用C#调用上面创建好的C++ DLL
1.创建一个简单的C#控制台程序,添加下面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CSharpTester
{
class Program
{
[DllImport(@"../../../Debug/CppTester.dll", EntryPoint = "UpdateCameraSetting", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
public extern static void UpdateCameraSetting(ref Camera camera,ref CameraSetting cameraSetting);
[DllImport(@"../../../Debug/CppTester.dll", EntryPoint = "GetCameraImageData", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
public extern static int GetCameraImageData(ref CameraImageData cameraImageData);
static void Main(string[] args)
{
Camera camera1 = new CSharpTester.Program.Camera();
camera1.CameraId = 1;
camera1.CameraName = "MyCamera001" ;
CameraSetting cameraSetting1 = new CameraSetting();
cameraSetting1.Setting1 = 10;
cameraSetting1.Setting2 = true;
cameraSetting1.Setting3 = "MySetting001" ;
UpdateCameraSetting(ref camera1,ref cameraSetting1);
CameraImageData cameraImageData = new CameraImageData();
GetCameraImageData(ref cameraImageData);
}
[System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)]
public struct Camera
{
public int CameraId;
public CameraSetting Setting;
[System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string CameraName;
}
[System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)]
public struct CameraSetting
{
public int Setting1;
public bool Setting2;
[System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string Setting3;
}
[System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)]
public struct CameraImageData
{
public int CameraId;
[System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string CameraName;
[System.Runtime.InteropServices.MarshalAs(UnmanagedType.ByValArray, SizeConst = 50000)]
public byte[] Image;
public CameraSetting Setting;
};
}
}
2.运行c#程序,断点进入关键的两个函数,看看数据是否正确 (如果不能进入C++调试请参考这里:C#调试C++代码)
函数1:
函数2:
数据都正确