C#调用C++ DLL

记录一下两个内容:c#

1.使用VS2015建立C++ DLL;函数

2.使用C#调用上面建立好的C++ DLL;spa


一.使用VS2015建立C++ DLL.net

1.选择win32项目调试


2.点击【下一步】->选择 dll 和预编译头code


3.随便添加一个头文件【MyTester.h】:blog


并在stdafx.h文件中添加引用:图片


随便输入一些简单定义代码,这里以 struct / int / bool / char /BYTE 类型作些例子:get

// 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】:string

#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:



数据都正确