记录一下两个内容: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:
数据都正确