首页 > 编程语言 >在C#中调用C++dll

在C#中调用C++dll

时间:2024-08-23 15:04:58浏览次数:10  
标签:C# double C++ dll int Length doubles ptr

 

 

 

 一、C++函数中的double** 参数

C++ DLL中的接口如下:

int gray2energy(double** data,const int length,const double gamma);

在C#中调用C++:

方式1,通过指针的方式在C#也用double**对应C++ 中的double**

 [DllImport("xxxx.dll", CallingConvention = CallingConvention.Cdecl)]
 public unsafe static extern int gray2energy(double** dd, int length, double gamma);

方式2:

[DllImport("xxxx.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int gray2energy(ref IntPtr dd, int lenght, double gamma);

 

若采用第一种方式,可这样实现:

//已知doubles
double[] doubles = byteToDouble(bts);
if (doubles == null || doubles.Length == 0)
    return;
unsafe
{
    fixed (double* doublePtr = doubles)
    {
        double** doubdoubPtr = &doublePtr;
        int res = gray2energy(doubdoubPtr, doubles.Length, 2);
    }
}

 

若采用第二种方式,可这样实现:

//申请内存大小
double[] resDoubles = new double[doubles.Length];
int size = Marshal.SizeOf(typeof(double)) * doubles.Length;
IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
    Marshal.Copy(doubles, 0, ptr, doubles.Length);
    int res = gray2energy(ref ptr, doubles.Length, 2);
    Marshal.Copy(ptr, resDoubles, 0, doubles.Length);
}
finally
{
    Marshal.FreeHGlobal(ptr);
}

 

二、C++函数中的double* 参数

C++ DLL中的接口如下:

Bin_Gen(char* binName,double* R,double* G,double* B,char* param)

C#中调用:

方式一:

[DllImport("Vision.dll", CallingConvention = CallingConvention.Cdecl)]
extern static int Bin_Gen(string path, 
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] double[] r, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] double[] g, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] double[] b,
string param);

或方式二:

public extern unsafe static int Bin_Gen(string path, double* r, double* g, double* b, string param);

采用方式一,直接传入c#中的double[]即可。

采用方式二,可这样实现:

// 已知double[] binData_R、double[] binData_G、double[] binData_B、int nResult
unsafe
{
    fixed (double* r_ptr = binData_R)
    {
        fixed (double* g_ptr = binData_G)
        {
            fixed (double* b_ptr = binData_B)
            {
                nResult = Bin_Gen(hexPath, r_ptr, g_ptr, b_ptr, "")
            }
        }
    }
}

 

标签:C#,double,C++,dll,int,Length,doubles,ptr
From: https://www.cnblogs.com/moon-stars/p/18351243

相关文章

  • 小朋友学C++-题集
    小朋友学C++参考c语言基础啊哈C语言书籍算法图解-python.pdfc语言教程在线C++/C/python编译器C语言基础==========================C语言精读100例!!!!C语言实验指导与习题解答小项目学习扫雷小游戏贪吃蛇小游戏学生成绩管理系统图书管理系统小说分析软件第一章,与......
  • [Flink] Flink CDC Connactors FAQ
    FlinkCDCConnactorsFAQ近期遇到FlinkCDC的问题较多,故基于第1篇参考文献的FAQ文档基础之上,对这些问题做个系统的总结。MYSQLCDCQ:作业报错ConnectException:Aslavewiththesameserver_uuid/server_idasthisslavehasconnectedtothemaster,怎么办呢?FlinkCDC......
  • Springboot计算机毕业设计旅游网站8cmjx
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,景点类型,景点信息,房间类型,酒店信息,酒店预约,游记分享,套餐信息,路线预订开题报告内容一、选题背景与意义随着互联网技术的飞速发展,旅游业正经历着前所......
  • 24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,33
    目录198.打家劫舍题目描述题解213.打家劫舍II题目描述题解337.打家劫舍III题目描述题解打家劫舍的一天......
  • Springboot计算机毕业设计旅游管理系统z1fuc
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,景点分类,景点信息,酒店信息,购买门票,酒店预定开题报告内容一、课题的目的与意义随着旅游业的蓬勃发展,旅游市场日益多元化和复杂化,游客对于旅游服务的需......
  • centos单网卡配置VLAN,ubuntu当网卡配置VLAN,vlanid=1000
    root@ubuntu:~#cat/etc/netplan/01-netcfg.yaml#Thisfiledescribesthenetworkinterfacesavailableonyoursystem#Formoreinformation,seenetplan(5).network:version:2renderer:networkdethernets:enp9s0:dhcp4:novlans:......
  • ctfhub-rce-部分做题记录
    命令注入检查网页显示内容,可以直接看到源代码。大致意思是:检查用户输入的GET请求,判断用户是否输入了ip信息。如果输入了ip信息,则使用用户输入的这个ip数据执行一个shell命令"ping-c4"。输入127.0.0.1;cat104211044913917.php没回显,查看源代码过滤cat输入......
  • ACL 2022 SWCC 论文拆解
    引言本文贡献Wearemotivatedtoaddresstheaboveissueswiththegoalofmakingbetteruseofcooccurrenceinformationofevents.Tothisend,wepresentSWCC:aSimultaneousWeaklysupervisedContrastivelearningandClusteringframeworkforeventreprese......
  • 基础组件:ICON
    Flutter中,可以像Web开发一样使用iconfont,iconfont即“字体图标”,它是将图标做成字体文件,然后通过指定不同的字符而显示不同的图片。在字体文件中,每一个字符都对应一个位码,而每一个位码对应一个显示字形,不同的字体就是指字形不同,即字符对应的字形是不同的。而在iconfont中,只......
  • Docker部署Nginx,无法访问的解决办法
    最近用阿里云的服务器部署了一下Nginx,发现无法通过外网访问,排除掉防火墙和端口映射的问题,最终在阿里云官方发现解决办法,docker0网桥的网段与内网eth0网段冲突,可能导致Nginx无法访问,修改Docker的网段后正常访问.1.运行以下命令,查看docker0和eth0网段是否冲突route如果回显信......