欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

64位程序调用32DLL解决方案

程序员文章站 2022-03-06 20:53:10
最近做一个.NETCore项目,需要调用以前用VB6写的老程序,原本想重写,但由于其调用了大量32DLL,重写后还需要编译为32位才能运行,于是干脆把老代码整个封装为32DLL,然后准备在64位程序中调用。(注意Windows系统中,先要把DLL注册为COM) 为了实现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);
                    }
                }