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服务,添加即可. 部署: 启 ...
随机推荐
- C# 实现本地化日志管理
1.新建一个类库解决方案 CommnoLog 2.新建两个文件夹 2.1FileUtil.cs 代码如下 public static class FileUtil { /// <summary ...
- 【Design Patterns】监听器模式
监听器模式 监听器模式其实是观察者模式中的一种,两者都有关于回调的设计. 与观察者模式不同的是,观察者模式中存在的角色为观察者(Observer)和被观察者(Observable) 而监听器模式中存在 ...
- 有关JSOUP学习分享(一)
其实现在用JSOUP爬虫的也不多了,但是由于最近换公司,做数据爬虫需要用到,就看了下,感觉还是挺好用的,原理什么的感觉和weblogic也差不到哪里去,废话少说,这里就简单的分享下最近接触的干货. J ...
- 开发中遇到的Cause: java.sql.SQLException: connection holder is null的异常
异常的出现是属于获取连接超时,从而找不到持有者. 项目中的配置体现: <property name="removeAbandoned" value="true&qu ...
- encryptjs 加密 前端数据(vue 使用 RSA加密、java 后端 RSA解密)
1.index.html引入 <script src="./static/js/jsencrypt.min.js"></script> 或者 npm i j ...
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur
屠龙宝刀点击就送 Tarjan缩点+拓扑排序 以后缩点后建图看n范围用vector ,或者直接用map+vector 结构体里数据要清空 代码: #include <cstring> #i ...
- xpath定位和css定位对比
xpath定位和css定位对比 实际项目中使用较多的是xpath定位和css定位.XPath是XML文档中查找结点的语法,换句话就是通过元素的路径来查找这个元素.xpath比较强大,而css选择器 ...
- fork新建进程
#include <sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdio.h> ...
- k8s1.13.0二进制部署-ETCD集群(一)
Kubernetes集群中主要存在两种类型的节点:master.minion节点. Minion节点为运行 Docker容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能.Ma ...
- linux文本处理工具及正则表达式
cat命令:查看文本内容 cat [选项]... [文件]... -E 显示行结束符 -n 显示文本内容时显示行号 -A 显示所以控制符 -b 非空行编号 -s 压缩连 ...