C#调用C++ DLL

记录一下两个内容:

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:



数据都正确


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值