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的更多相关文章

  1. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  2. C数组&结构体&联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  3. c++ 数组 结构体

    接下来的一点时间我将会记录下我看的c++的一些心得体会,人贵在坚持,希望我可以一直坚持下去!!Go Fighting!   一.c++复合数据类型: 数组类型的一些注意事项: sizeof的用法: 当 ...

  4. C89,C99: C数组&结构体&联合体快速初始化

    1. 背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组 ...

  5. Leetcode LRU缓存,数组+结构体实现

    一.算法思路 LRUCache类有以下函数和变量: LRUCache(int capacity): capacity是当前对象能够存储的键值对(key,value)最大个数. int get(int ...

  6. 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const

    一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...

  7. C#调用C/C++动态库 封送结构体,结构体数组

    一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...

  8. C#调用C/C++动态库,封装各种复杂结构体

    C#调用C/C++动态库,封装各种复杂结构体. 标签: c++结构内存typedefc# 2014-07-05 12:10 6571人阅读 评论(1) 收藏 举报  分类: C(8)  C#(6)  ...

  9. C# 调用C++结构体

    参考网址:C#调用C/C++动态库,封装各种复杂结构体._liguo9860的专栏-CSDN博客 现在公司要做一个使用C#程序调用C++的一个DLL库,解析文件的功能.所以在网上找了一些资料.     ...

随机推荐

  1. 【LeetCode-面试算法经典-Java实现】【032-Longest Valid Parentheses(最长有效括号)】

    [032-Longest Valid Parentheses(最长有效括号)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string contai ...

  2. 关键字&标识符

    关键字:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 保留字: 标识符:凡是自己可以起名字的地方都叫标识符 命名的规则:(一定要遵守,不遵守就会报编译的错误)由26个英文字母大小写,0- ...

  3. HAProxy高可用配置视频教程

    HAProxy提供高可用性.负载均衡等,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在当前的硬件上, ...

  4. Multi-process Architecture

    For Developers‎ > ‎Design Documents‎ > ‎ Multi-process Architecture This document describes Ch ...

  5. HDU 4431 Mahjong 模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4431 不能说是水题了,具体实现还是很恶心的...几乎优化到哭但是DFS(还加了几个剪枝)还是不行...搜索一直T ...

  6. SpringBoot 增加 拦截器 判断是否登录

    1.创建拦截器 package com.example.demo.interceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactor ...

  7. 关于idea开发工具常用的快捷键

    自动补全缺失的import    alt+enter 自动优化import ctrl+alt+o 自动补全返回代码:IDEA的ctrl+alt+v ,eclipse的CTRL+F1 main    p ...

  8. 【Henu ACM Round#15 A】 A and B and Chess

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 统计大写和小写的个数. 比较答案.输出即可. [代码] #include <bits/stdc++.h> using n ...

  9. jmind-redis一个redis的nio客户端

    Redis是一个基于key/value的系统.Redis目前最新版本是2.2.4,用着很不错,不过java版本的客户端比较的不给力,目前redis 客户端jedis 是基于io 的socket . 而 ...

  10. Java 实现有序链表

    有序链表: 按关键值排序. 删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时须要比較O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 假设一个应用须 ...