C#调用C++数组,结构体DLL
1.基本数据类型的传递
常见数据类型的传递
|
C/C++ |
C# |
长度 |
|
short |
short |
2Bytes |
|
int |
int |
4Bytes |
|
long(该类型在传递的时候常常会弄混) |
int |
4Bytes |
|
bool |
bool |
1Byte |
|
char(Ascii码字符) |
byte |
1Byte |
|
wchar_t(Unicode字符,该类型与C#中的Char兼容) |
char |
2Bytes |
|
float |
float |
4Bytes |
|
double |
double |
8Bytes |
C++传入、传出C#数组都可以实现,传入数组直接传入,传出数组需要用指针传出。
(1).C++传入数组(测试1加到9的和)
.cpp文件
extern "C" __declspec(dllexport) void test(const int N, const int n[], int& Z)
{
for (int i = ; i<N; i++)
{
Z += n[i];
}
}
.cs文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace Application6
{
class Program
{
[DllImport(@"C:\Users\wdy\Documents\visual studio 2013\Projects\Application5\Debug\Application5.dll", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public static extern double test(int N, int[] n, ref int Z); static void Main(string[] args)
{
int N = ;
int[] n;
n = new int[];
for (int i = ; i < ; i++)
{
n[i] = i;
}
test(n.Length, n, ref N);
Console.WriteLine(N.ToString());
Console.Read();
}
}
}
结果:

(2).C++传出数组(测试传出结构体数组指针字符串)
.cpp文件
#include "stdafx.h"
#include "Application3.h" struct cmppe_submit
{
char user[][];
}; extern "C" __declspec(dllexport) void GetUser(cmppe_submit* lpSubit)
{
strcpy(lpSubit->user[], "waqerqwdsewf");
}
.cs文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace Application4
{
class Program
{
struct cmppe_submit
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public byte[] dst_addr;
}
[DllImport(@"C:\users\wdy\documents\visual studio 2013\Projects\Application3\Debug\Application3.dll", EntryPoint = "GetUser", CallingConvention = CallingConvention.Cdecl)]
private extern static void GetUser(ref cmppe_submit lpSubmit);//用ref声明结构 static void Main(string[] args) {
cmppe_submit submit;
submit.dst_addr = new byte[];
GetUser(ref submit); string str = System.Text.Encoding.Default.GetString(submit.dst_addr, , ); Console.WriteLine(str); Console.Read();
}
}
}
调试中出现过的Bug:
.Program::GetUser”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
添加属性:EntryPoint = "GetUser", CallingConvention = CallingConvention.Cdecl
结果:

(3)C++传入、传出带参数结构体
.h文件
#define TESTCPPDLL_API __declspec(dllexport)
struct Vector3 { float X, Y, Z; }; EXTERN_C TESTCPPDLL_API void __stdcall SendStructFromCSToCPP(Vector3 vector);
.cpp文件
TESTCPPDLL_API void __stdcall SendStructFromCSToCPP(Vector3 vector) {
vector.X = vector.X + ;
cout << "got vector3 in cpp,x:"; cout << vector.X+; cout << ",Y:"; cout << vector.Y; cout << ",Z:"; cout << vector.Z; }
.CS文件
[StructLayout(LayoutKind.Sequential)] struct Vector3
{ public float X, Y, Z; } [DllImport(@"C:\Users\wdy\Documents\visual studio 2013\Projects\TestCPPDLL\x64\Debug\TestCPPDLL.dll", EntryPoint = "SendStructFromCSToCPP")] extern static void SendStructFromCSToCPP(Vector3 vector);
Vector3 vector = new Vector3() { X = , Y = , Z = }; //将vector传递给C++并在C++中输出 SendStructFromCSToCPP(vector);
结果:

C#调用C++数组,结构体DLL的更多相关文章
- C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)
函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
- C数组&结构体&联合体快速初始化
背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...
- c++ 数组 结构体
接下来的一点时间我将会记录下我看的c++的一些心得体会,人贵在坚持,希望我可以一直坚持下去!!Go Fighting! 一.c++复合数据类型: 数组类型的一些注意事项: sizeof的用法: 当 ...
- C89,C99: C数组&结构体&联合体快速初始化
1. 背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组 ...
- Leetcode LRU缓存,数组+结构体实现
一.算法思路 LRUCache类有以下函数和变量: LRUCache(int capacity): capacity是当前对象能够存储的键值对(key,value)最大个数. int get(int ...
- 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const
一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...
- C#调用C/C++动态库 封送结构体,结构体数组
一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...
- C#调用C/C++动态库,封装各种复杂结构体
C#调用C/C++动态库,封装各种复杂结构体. 标签: c++结构内存typedefc# 2014-07-05 12:10 6571人阅读 评论(1) 收藏 举报 分类: C(8) C#(6) ...
- C# 调用C++结构体
参考网址:C#调用C/C++动态库,封装各种复杂结构体._liguo9860的专栏-CSDN博客 现在公司要做一个使用C#程序调用C++的一个DLL库,解析文件的功能.所以在网上找了一些资料. ...
随机推荐
- DECLARE CURSOR (Transact-SQL)
Defines the attributes of a Transact-SQL server cursor, such as its scrolling behavior and the query ...
- ISheet ICell
/// <summary> /// Gets the first row on the sheet /// </summary> /// <value>the nu ...
- Git简介以及与SVN的区别
Git是由著名Linux内核(Kernel)开发者LinusTorvalds为了便利维护Linux而开发的. Git是一个分布式的版本控制系统.作为一个分布式的版本控制系统,在Git中并不存在主库这样 ...
- Sqoop 的优势
1.sqoop可以高效的可控的利用资源,比如它可以通过调整任务数,来控制任务的并发度,另外还可以配置数据库的访问时间等等 2.sqoop能自动的完成数据类型的映射与转换 3.它支持多种数据库,比如my ...
- AIX 软件包结构
AIX installp软件包结构 1. usr部分 2. / (root)部分 3. share部分 AIX 为了实现在客户机 / 服务器环境下安装的灵活性将安装包划分为 usr 部分 .r ...
- Flex之柱状图实例
Flex之柱状图实例 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns ...
- python数据处理技巧二
python数据处理技巧二(掌控时间) 首先简单说下关于时间的介绍其中重点是时间戳的处理,时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00 ...
- php远程抓取图片
public function GrabImage($url,$filename="") { if($url=="") return false ...
- K-近邻算法学习
# -- coding: utf-8 -- from numpy import * import operator def createDataSet(): group = array([[1.0,1 ...
- 基于r-Kernel的LiteOS操作系统
LiteOS是应用于资源受限的传感网络的一种基于线程的类UNIX操作系统.也就是说它跑在存储空间和RAM有限的超低电压微控制器上,这也是吸引我关注它的原因(在超低电压下系统更易出错).它採用r-ker ...