64位程序调用32DLL解决方案
最近做一个.NETCore项目,需要调用以前用VB6写的老程序,原本想重写,但由于其调用了大量32DLL,重写后还需要编译为32位才能运行,于是干脆把老代码整个封装为32DLL,然后准备在64位程序中调用。(注意Windows系统中,先要把DLL注册为COM)
为了实现64位程序调用32DLL,我尝试了大量方法,但效果都不是很理想,偶然中发现.NetCore的“管道”,可以完美地解决这个问题,具体思路如下:
1、创建一个.NETFramework32位程序,在其中对封装的老代码进行引用(COM中引用),然后将其接口暴露
2、创建64位.NETCore程序,在其启动时,为第一步创建的程序创建进程,并启动
3、使用“双工管道”让64位程序与32程序进行通信,完美实现64位程序调用32DLL
下边代码展示一个简单的管道通信过程:
A、64程序代码
static void Main(string[] args)
{ //创建refpropPipe进程
Process process = new Process();
//将refpropPipe.exe放在与refprop64Hv相同路径下,相对路径引用
process.StartInfo.FileName = @"C:\Users\Administrator\source\repos\refpropPipe\refpropPipe\bin\Debug\refpropPipe.exe";
//process.StartInfo.FileName = "refpropPipe.exe";
process.Start();
double value = 0;
//向refpropPipe发送调用信息,即查询输入变量值
using (NamedPipeClientStream pipeClientStream = new NamedPipeClientStream("request"))
{
pipeClientStream.Connect();
string input = Method + "," + FluidName + "," + InpCode + "," + Units + "," + Prop1 + "," + Prop2;
using (StreamWriter writer = new StreamWriter(pipeClientStream))
{
writer.WriteAsync(input);
}
}
//接收refpropPipe返回的信息,即查询结果
using (NamedPipeClientStream pipeClientStream = new NamedPipeClientStream("respose"))
{
pipeClientStream.Connect();
using (StreamReader reader = new StreamReader(pipeClientStream))
{
string val = reader.ReadToEnd();
value = Convert.ToDouble(val);
}
}
process.WaitForExit();
process.Close(); }
B、32位程序代码
static void Main(string[] args)
{
double respose = 0;
///接收refprop64Hv的输入信息
using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("request"))
{
pipeStream.WaitForConnection();
using (StreamReader reader = new StreamReader(pipeStream))
{
//此处接收到消息后,对32Dll进行调用
} //向refprop64Hv返回结果
using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("respose"))
{
pipeStream.WaitForConnection();
using (StreamWriter writer = new StreamWriter(pipeStream))
{
string res = respose.ToString();
writer.WriteAsync(res);
}
}
64位程序调用32DLL解决方案的更多相关文章
- Linux:使用rpcgen实现64位程序调用32位库函数
摘要:本文介绍使用rpcgent实现64位程序调用32位库函数的方法,并给出样例代码. 我的问题 我的程序运行在64位Linux系统上,需要使用一个从外部获得的共享库中的函数,这个共享库是32位的,无 ...
- Linux:32/64位程序(应用程序、共享库、内核模块)
摘要: Linux系统区分32/64位,相应地,应用程序.共享库和内核模块也区分32/64位. 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序.共享库和内核模块. 1. 应用程序 ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- 64位进程调用32位dll的解决方法
64位进程调用32位dll的解决方法 最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/ ...
- 32位程序调用Oracle11gR2数据库libclntsh.so失败
[问题描述]32位程序调用Oracle11gR2数据库的libclntsh.so库时会返回失败. [问题原因]32位程序只能调用32位的Oracle客户端实例包,而R2数据库默认安装完毕后是没有lib ...
- JAVA判断32位还是64位,调用不同的DLL(转)
源:JAVA判断32位还是64位,调用不同的DLL 通过获取sun.arch.data.model可判断是32还是64的JAVA 将32或者64位的DLL放不同的目录,实现自适应调用DLL Prope ...
- 64位程序,long*转long 出错
原因: long*在64位程序中占8个字节,long占4个字节.强转会出错. 解决方法: 把long用long long替换,long long 占8个字节
- 如何在linux 32位机器编译64位程序
编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序. 编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64 ...
- 64位.net调用32位com服务(c++)
说明: 因64位.net无法调用32位dll,才采用调用进程外com形式. 该项目必须为release时编译才不会报错. 项目调用时,添加引用->com中找到该com服务,添加即可. 部署: 启 ...
随机推荐
- nodejs 实践:express 最佳实践(八) egg.js 框架的优缺点
nodejs 实践:express 最佳实践(八) egg.js 框架的优缺点 优点 所有的 web开发的点都考虑到了 agent 很有特色 文件夹规划到位 扩展能力优秀 缺点 最大的问题在于: 使用 ...
- Ext2文件系统的特点
1.文件更新策略的谨慎实现将系统崩溃的影响减到最少.我们只举一个例子来体现这个优点:例如,当给文件创建一个硬链接时,首先增加磁盘索引节点中 的硬链接计数器,然后把这个新的名字加到合适的目录中.在这种方 ...
- new() 与new
一般写的时候,new对象都要加()
- 评价PE基金绩效的常用指标
作为信息系统,辅助管理层决策是重要的功能之一.前文介绍了PE基金管理系统的建设,对PE业务的运转有了一些了解,但没有介绍如何评价PE基金的绩效,而这是管理层作出重大决策的主要依据之一.PE基金本质也是 ...
- 多线程串口通信 MFC CSerialPort
写在前面: 晚上应该继续完成未写完的代码,但Chrome上打开的标签实在太多了,约30个了,必须关掉一些,所以需要把自己看的整理一下然后关掉.本次主要写点MFC环境下多线程串口通信相关的东西,这包括线 ...
- 配置文件无法修改(以修改my-default.ini为例)
现象: 保存my-default.ini时如果提示“拒绝访问”,右击my-default.ini文件 解决办法: 属性—>安全—>修改权限
- 记一次RabbitMq 安装和配置坑
记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...
- Spring 和 Mybatis 整合
Spring 和 Mybatis 整合 Spring本身的Config文件: 在IDEA下面配置好文件后, 在WEB-INF下面有三个配置文件分别是web.xml, applicationContex ...
- unbuntu&vim&Kali的各种小知识
1. vmware workstation 15.0.0 2.ubuntu-18.10-desktop 使用网络地址转换 VMware workstation 1.ctrl+alt 返回 unbu ...
- Set、Map及数组去重
https://cloud.tencent.com/developer/article/1437254 https://blog.csdn.net/weixin_34247299/article/de ...