C#64位程序调用32位C/C++库方法

步骤

        • 1、编写32位控制台程序
        • 2、实现字符串传参
        • 3、封装Process类库
        • 4、获取进程调用的返回值

在实际的项目中经常使用一些第三方C/C++库,于历史原因,有的C库是32位的,由于没有源代码,所以一般很难修改为64位的类库,但又需要调用,怎么办呢,在参考了一些大神的博客后,总结出了一个独立进程访问的方法,来调取第三方库,获取返回值

1、编写32位控制台程序

编写一个32位的控制台程序,用于被主程调用

public class Program
{public static void Main(string[] args){if(args.Length > 0 && !string.IsNullOrEmpty(args[0])){string paramStr = args[0];//获取传递过来的参数//调用三方C/C++库逻辑/*...................................*///将指定的字符串值(后跟当前行终止符)写入标准输出流。Console.WriteLine(result);}}
}
2、实现字符串传参

由于Main函数进程传参的参数类型只能是字符串,所以需要把C/C++库函数所需的byte[]类型参数转换成字符串类型,互转方法参数选择16进制字符串,代码如下:

// byte[]转16进制字符串
StringBuilder sb = new StringBuilder();
foreach (byte b in msgbuf)
{//{0:X2} 大写方式sb.AppendFormat("{0:x2}", b);
}
string argsStr = sb.ToString();// 16进制字符串转byte[]
var msgbuf = new byte[hexStr.Length / 2];
for (var x = 0; x < msgbuf.Length; x++)
{var i = Convert.ToInt32(hexStr.Substring(x * 2, 2), 16);msgbuf[x] = (byte)i;
}
3、封装Process类库

封装一个简洁的ProcessCommandBase 帮助类来调用exe封装的第三方库进程,且可以返回被封装C库函数的返回值


public class ProcessCommandBase : IDisposable
{//程序名public string programe;//参数StringBuilder parameter = new StringBuilder();Process process = null;public ProcessCommandBase(string programe){this.programe = programe;}public ProcessCommandBase AddParameter(string para){parameter.Append($" {para} ");return this;}public string Exec(bool waitForExit = false){//var baseDir = AppDomain.CurrentDomain.BaseDirectory;process = new Process();process.StartInfo.FileName = programe;process.StartInfo.Arguments = parameter.ToString();process.StartInfo.CreateNoWindow = true;process.StartInfo.UseShellExecute = false;//重定向标准输输出、标准错误流process.StartInfo.RedirectStandardError = true;process.StartInfo.RedirectStandardOutput = true;process.ErrorDataReceived += Process_ErrorDataReceived;process.Exited += Process_Exited;process.OutputDataReceived += Process_OutputDataReceived;Trace.WriteLine($"Exe:{programe}");Trace.WriteLine($"Parameter:{parameter.ToString()}");process.Start();process.BeginErrorReadLine();//process.BeginOutputReadLine();if (waitForExit){string result = process.StandardOutput.ReadToEnd();process.WaitForExit();return result;}return string.Empty;}public void Process_OutputDataReceived(object sender, DataReceivedEventArgs e){Trace.WriteLine(e.Data ?? string.Empty);}public void Process_Exited(object sender, EventArgs e){}public void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e){Trace.WriteLine(e.Data ?? string.Empty);}public void ClearParameter(){parameter.Clear();}public void Close(){process?.Close();process = null;}public void Kill(){process?.Kill();process?.Close();process = null;}public void Dispose(){Kill();}
}
4、获取进程调用的返回值

调用执行封装后的控制台程序后,需要获取被封装C库的返回值

var exec = new ProcessCommandBase("test.exe");
exec.AddParameter("xxxxxxxxxxxx");
var result = exec.Exec(true);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Global Mapper SDK 19 中文开发文档(十三)完结

7.4 委托的详细描述 7.4.1 GM_Change3DViewCallbackFunc public delegate void GM_Change3DViewCallbackFunc(GM_Rectangle_t aNewViewBounds, //new 3D view boundsIntPtr aUserData //user data passed into GM_3DSetChangeViewCallback function ) 7…

TCM - 紧耦合内存

ARM 的ram包括静态ram&#xff0c;动态ram&#xff0c;TCM---紧耦合内存(TCM: Tightly Coupled Memories)。 TCM是一个固定大小的RAM&#xff0c;紧密地耦合至处理器内核&#xff0c;提供与cache相当的性能&#xff0c;相比于cache的优点是&#xff0c;程序代码可以精确地控制…

当hashCode相同时,equals是否也相同?

在Java中&#xff0c;理解对象的这两个基本方法—hashCode和equals对于编码是至关重要的&#xff0c;尤其是在处理集合类如HashMap和HashSet时。然而&#xff0c;一个常见的误解是&#xff0c;如果两个对象有相同的哈希码&#xff08;hashCode&#xff09;&#xff0c;那么它们…

SQL WHERE 语句(条件选择)

WHERE 子句用于过滤记录。 SQL WHERE 子句 WHERE 子句用于提取那些满足指定条件的记录。 SQL WHERE 语法 SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明&#xff1a; column1, column2, ...&#xff1a;要选择的字段名称&#xff0c;可以为多…

iec104和iec61850

iec104和iec61850 IEC104 规约详细解读(一) 协议结构 IEC104 规约详细解读(二)交互流程以及协议解析 61850开发知识总结与分享【1】 Get the necesarry projects next to each other in the same directory; $ git clone https://github.com/robidev/iec61850_open_server.g…

ES(Elasticsearch)的基本使用

一、常见的NoSQL解决方案 1、redis Redis是一个基于内存的 key-value 结构数据库。Redis是一款采用key-value数据存储格式的内存级NoSQL数据库&#xff0c;重点关注数据存储格式&#xff0c;是key-value格式&#xff0c;也就是键值对的存储形式。与MySQL数据库不同&#xff0…

DNS安全与访问控制

一、DNS安全 1、DNSSEC原理 DNSSEC依靠数字签名保证DNS应答报文的真实性和完整性。权威域名服务器用自己的私有密钥对资源记录&#xff08;Resource Record, RR&#xff09;进行签名&#xff0c;解析服务器用权威服务器的公开密钥对收到的应答信息进行验证。如果验证失败&…

数字信号处理期末复习——计算小题(二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

图像清晰度评估指标

图像清晰度评估涉及多个指标&#xff0c;这些指标可用于定量测量图像的清晰度和质量。 以下是一些常见的图像清晰度评估指标&#xff1a; 均方根误差&#xff08;Root Mean Square Error&#xff0c;RMSE&#xff09;&#xff1a; 通过计算原始图像和处理后图像之间的像素差异的…

【实用工具】Gradio快速部署深度学习应用1:图像分类

前言 在AI快速发展的今天&#xff0c;我们作为算法开发人员&#xff0c;也应该有一些趁手的工具帮助我们快速开发并验证自己的想法&#xff0c;Gradio可以实现快速搭建和共享的功能&#xff0c;能够展示出一个前端界面&#xff0c;把我们的算法包裹起来&#xff0c;快速验证算…

Java八股文面试全套真题【含答案】- Elasticsearch篇

以下是关于Java八股文面试全套真题- Elasticsearch篇 1.什么是Elasticsearch&#xff1f; 答案&#xff1a;Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;用于实时存储、搜索和分析大规模数据集。 2.Elasticsearch的主要特点是什么&#xff1f; 答案&#xff…

DNS主从服务器、转发(缓存)服务器

一、主从服务器 1、基本含义 DNS辅助服务器是一种容错设计&#xff0c;考虑的是一旦DNS主服务器出现故障或因负载太重无法及时响应客户机请求&#xff0c;辅助服务器将挺身而出为主服务器排忧解难。辅助服务器的区域数据都是从主服务器复制而来&#xff0c;因此辅助服务器的数…

Vue2多入口,独立打包配置

提示&#xff1a;Vue2多入口&#xff0c;独立打包配置 文章目录 前言一、修改二、打包和效果预览三、具体操作的文件四、代码包总结 前言 需求&#xff1a;富文本编辑器 一、修改 1、复制&#xff1a;index.html文件并改名share.html。 路径&#xff1a;工程文件夹/index.html …

Android studio BottomNavigationView 应用设计

一、新建Bottom Navigation Activity项目&#xff1a; 二、修改bottom_nav_menu.xml: <itemandroid:id"id/navigation_beijing"android:icon"drawable/ic_beijing_24dp"android:title"string/title_beijing" /><itemandroid:id"i…

Leetcode 第 374 场周赛题解

Leetcode 第 374 场周赛题解 Leetcode 第 374 场周赛题解题目1&#xff1a;2951. 找出峰值思路代码复杂度分析 题目2&#xff1a;2952. 需要添加的硬币的最小数量思路代码复杂度分析 题目3&#xff1a;2953. 统计完全子字符串思路代码复杂度分析 题目4&#xff1a;2954. 统计感…

Excel 插件:ASAP Utilities Crack

ASAP Utilities是一款功能强大的 Excel 插件&#xff0c;填补了 Excel 的空白。在过去的 20 年里&#xff0c;我们的加载项已经发展成为世界上最受欢迎的 Microsoft Excel 加载项之一。 ASAP Utilities 中的功能数量&#xff08;300 多个&#xff09;可能看起来有点令人眼花缭乱…

(python)Pyinstaller使用以及相关问题

前言 PyInstaller 可以将 Python 程序打包为独立的可执行文件&#xff0c;不需要用户手动安装 Python 和相关依赖。这使得分发和部署变得更加简单&#xff0c;方便将 Python 程序交付给其他用户或客户。 安装 pip install pyinstaller 相关参数 -F 或 --onefile&#xff1a;…

pdf格式转换为txt格式

pdf文档转换为txt文档 首先在python3虚拟环境中安装PyPDF2 Python 3.6.8 (default, Jun 20 2023, 11:53:23) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux Type "help", "copyright", "credits" or "license" for more infor…

答案解析——C语言—第2次作业:转义字符

本次作业的链接如下&#xff1a;C语言—第2次作业&#xff1a;转义字符 1.下面哪个不是C语言内置的数据类型&#xff1a; C char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点数double //双精度浮点数 …

PNG图片导入Abaqus建模:Abaqus Image To Part 2D插件

插件介绍 Abaqus Image To Part 2D - AbyssFish 插件可将图像导入Abaqus内并通过对网格单元集进行材料指定&#xff0c;实现基于图像的模型部件生成。 插件支持JPEG、JPG、PNG、GIF、TIFF、BMP、PCX、ICO等多种图像格式&#xff0c;兼容彩图、灰度图、二值图像等类型&#x…