请问C#如何自适应去调用C++ 32、64位Dll

由于32位64位dll名称一直,所有的函数也是一直的,这样的话如何区分以及调用呢?
图片说明

求指导。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Demo1
{
    public partial class Form1 : Form
    {
        [DllImport(@"D:\demo\串口Demo\Demo1\Demo1\x64\ComMon.dll")]
        private static extern int CM_DLLVersion();
        [DllImport(@"D:\demo\串口Demo\Demo1\Demo1\x86\ComMon.dll")]
        private static extern int CM_DLLVersion();

        public Form1()
        {
            InitializeComponent();
        }
    }
}

-4

3个回答

一个方法是安装程序里根据CPU类型决定装32位还是64位版本,这样你代码里只要写DllImport ComMon.dll,CLR到应用程序目录下加载到的就是正确的版本。

另一个方法是32位和64位版本的DLL都装上,但是装到不同目录,DllImport 的时候还是直接写ComMon.dll,但是加载的时候自定义AppDomain.CurrentDomain.AssemblyResolve的处理来更改DLL搜索路径。

static void Main()
{

        AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;
                    ……
private static Assembly AssemblyResolve(object sender, ResolveEventArgs args)
        {
            if (args.Name.StartsWith("ComMon.dll"))
            {
                string assemblyName = args.Name.Split(new[] { ',' }, 2)[0] + ".dll";
                string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                                                       Environment.Is64BitProcess ? "x64" : "x86",
                                                       assemblyName);

                return File.Exists(archSpecificPath)
                           ? Assembly.LoadFile(archSpecificPath)
                           : null;
            }

            return null;
        }
0
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Demo1
{
    public partial class Form1 : Form
    {
        [DllImport(@"D:\demo\串口Demo\Demo1\Demo1\x64\ComMon.dll")]
        private static extern int CM_DLLVersion64();
        [DllImport(@"D:\demo\串口Demo\Demo1\Demo1\x86\ComMon.dll")]
        private static extern int CM_DLLVersion32();

        public Form1()
        {
            InitializeComponent();
        }
    }
}

if (Environment.Is64BitOperatingSystem)
CM_DLLVersion64();;
else
CM_DLLVersion32();
1
wh3845348
99887744 算了,你还是别回答了,都说了引用的Dll改不了函数名,你就在这改个CM_DLLVersion32(64),还说我不会写,你引用外部DLL你能把名字都给改了?就算能函数重命名,一共N多函数我也不可能全部重命名,明白吗?厂商的文档中就没有CM_DLLVersion32(64)函数
8 个月之前 回复
devmiao
见了你女王大人喵姐还不跪下 回复wh3845348: 你根本完全都不会写程序啊,那和你怎么说,你找一个程序员吧
8 个月之前 回复
devmiao
见了你女王大人喵姐还不跪下 回复wh3845348: 写在你要调用的地方
8 个月之前 回复
wh3845348
99887744 还有函数是引用的dll,我这里是没有办法改的,dll是第三方的看不到源码,也改不了啊,并且所有函数都是重名的。
8 个月之前 回复
wh3845348
99887744 我在最下面写if else 会报错的啊。在namespace 外面。
8 个月之前 回复
wh3845348
99887744 在最先面直接写if else不是会报错的么。
8 个月之前 回复

图片说明 添加宏定义 这样来区分

-1
wh3845348
99887744 这样设置不行啊,Debug版本是测试包、Release版本是正式包。
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# 自适应调用64位 32位DLL
参考网上的经验交流,加上自己的实践总结,分享给大家,纪念两天的奋斗历程。 1、标准.NET的DLL,检查编译方式,确保为 ANY CPU,即可自适应。 2、标准SDK的DLL 编译两个DLL,一个WIN32,一个X64 用别名方式声明后在C#中封装 static bool is64bit = (IntPtr.Size == 8); [DllI...
32/64 DLL 自动选择加载
64-bit Windows will skip over the "wrong architecture" DLLs when searching, so all you have to do is put your 32-bit and 64-bit DLLs in different directories and add both directories to PATH.  原文出处 6...
关于.net编译anycpu、32位、64位dll
调试得出的结论1.调用了32位dll,如果编译的时候目标平台选anycpu或者X64的时候会提示这是因为我的电脑是64位的2.调用了anycpu编译的dll,目标平台随便选都没有问题 3.调用了64位dll,目标平台选X86也是报错BadImageFormatException所以anycpu是真的平台无关,看调用dll的exe是什么平台...
.NET框架下64位系统使用32位dll
经测试可用! 1.在编译时目标平台由 any CPU 改为 x86 2.将32位的System.Data.SQLite.dll复制到64位系统的C:\Windows\SysWOW64
请问C#如何自适应去调用C++ 32、64位Dll
C# Winformrn由于32位64位dll名称一致,所有的函数也是一致的,这样的话如何区分以及调用呢?rn[code=csharp]using System;rnusing System.Runtime.InteropServices;rnusing System.Windows.Forms;rnrnnamespace Demo1rnrn public partial class Form1 : Formrn rn [DllImport(@"D:\demo\串口Demo\Demo1\Demo1\x64\ComMon.dll")]rn private static extern int CM_DLLVersion();rn [DllImport(@"D:\demo\串口Demo\Demo1\Demo1\x86\ComMon.dll")]rn private static extern int CM_DLLVersion();rnrn public Form1()rn rn InitializeComponent();rn rn rnrn[/code]rn有没有大牛比较了解这里,求解决。
C#调用本地动态链接库时,根据x86或x64自动选择相应的动态链接库dll文件
利用c#开发的程序在调用dll文件时,可以根据系统类型选择正确的dll动态链接库。如下所示,可以创建两个DLLImport外部函数(分别对应32位版本和64位版本),然后创建一个包装方法,在包装方法中根据系统类型选择正确版本的方法。           //32bit        [DllImport("ASR\\ASR32.dll",EntryPoint = "startRec")] ...
32位程序访问64位DLL,使用COM组件
一直纠结于微软所谓的32位程序不能访问64位dll或64位程序不能访问32位dll,MSDN上的说明也不能完全理解。 这两天纠结的问题终于需要直面了,有个项目需要转到64位平台上运行(需要超4G内存),但它是用VC6.0开发的,第一反应想到下面几个方式: 1,将VC6.0项目转到VS2005及以上,确实这样做了,报出一堆错误,真心不想debug这个了,太古老了。 2,VC6.0开发6
关于Java调用32/64位dll的问题
最近在做一个项目,需要用到java的jni接口调用C++,本来很简单的一件事,却把我搞得晕头转向。是什么问题呢?32位与64位的问题。 由于C++要调用一个已经编译好,且没有源码的32位dll文件,所以最后编译好的dll是32位的。对于一个菜鸟来说,编译好了之后肯定不会去考虑32位的dll到底能不能用,而是着急的去部署,运行,然后满怀期待的等待虚拟世界的精彩。然后,理想很丰满,现实很骨感。Boo
32bit程序调用64bit dll解决办法的例子程序
32bit程序调用64bit dll 的解决办法 32bit程序不能直接调用64bit的dll,我们采用COM进程外组件的方式来实现间接调用。具体参考: http://blog.csdn.net/shakesky/article/details/23265811
64位程序如何调用32位dll(简单解决方案 )
因为一些呵呵的原因,我们写64位程序时需要调用32位的dll,或者32位程序需要调用64位的dll 至于为什么64位程序不能调用32位的dll,那是因为......你懂得 项目中我也遇到了这么一个没法回避的问题 看网上有写什么进程外com,没去研究,我用了一个比较简单的方案可以实现 主要就两个方案的结合 1.WM_COPYDATA 2.共享内存 实际的代码
c#(.net)调用c++dll[x86与x64]
c#项目用visual studio2013(debug是加载x86的dll,release加载的是x64的dll)在项目属性里修改编译环境 win32dll项目用visual studio2015,代码有宏定义还有注释,很全面
JNI JAVA 调取C++dll文件(64位/32位)动态库测试demo教程
首先准备环境: 系统环境:win10 64x系统 开发环境:JDK1.8以上 开发工具:java [Eclipse]  C++[VS2012] 参考网上资料: https://www.cnblogs.com/cuglkb/p/5665882.html (如有不妥,请告知) 代码demo部分:    创建一个名为JavaCJniTest的java项目,并创建一个test包;  创建一...
VS中 C# 引用 32位和64位两种版本
例如 引用System.Data.SQLite,此dll需要区分32位和64位 首先,先再解决方案中引用System.Data.SQLite 找到对应的 工程名.csproj。使用文本编辑器打开 这个文件 (记事本或者其他类似工具),这是一个使用xml方式的工程文件 。找到加载库的地方 <Reference Include="System.Data.SQLite"> ...
64位程序调用32位DLL
最近再把原来写的股票分析程序转换成64位版本,程序中调用了银江的通视数据接口dll,因为银江提供的dll是32位的,但windows下面64位程序并不能直接调用32位的dll,所以只能百度了.         网上有说用进程外com的方式可以,之前从没接触过com,硬着头皮搞了半天,发现了问题,进程外com对于dll提供函数返回值不涉及指针的话没有任何问题,但是如果dll函数返回值是一个指针
编译anycpu 引用X86或X64问题
1.宿主程序(main方法)使用anycpu编译运行 2.引用的dll使用了三方C/C++dll,只能使用X86/X64编译.此时生成时会提示"编译框架不匹配,可能无法使用".并且主程序运行时报"未能加载XXdll" 解决方法: 1.主程序(anycpu)使用反射的方式加载.   1) 32位(XP系统)只能使用x86的dll   2) 64位系统只能使用x64dll 2.主程序(x8
查看C++ C#的dll或exe文件是32位还是64位
使用vs自带的dumpbin.exe dumpbin.exe/headers 文件路径
使用VS工具查看dll是32位还是64位
1.打开vs中的开发者命令提示符工具(Developer Commond Prompt for VS XX)2.运行命令 >dumpbin /headers XXX.dll如上图,可以看到是32位的dll.
关于JNA调用32位和64位动态链接库,即*.dll
今天研究了下JNA,感觉收获不小,这货可比JNI好用多了。 先上个实例,我这参考了文章 http://blog.csdn.net/shadowsick/article/details/9101477#comments 我按照此文实现了JNA的第一个程序。 但是当我把这个程序拷到64位主机上再运行就会报错: Exception in thread "main" java
在python 3.6 64位的Windows里调用DLL出错
因为在电脑已经安装了64位的python 3.6版本,现在要开发一个调用DLL的程序,由于这个DLL是32位的,所以使用WINDLL调用它,运行下面的代码:# #https://blog.csdn.net/caimouse/article/details/51749579 #开发人员:蔡军生(QQ:9073204) 深圳 2018-3-25 # from ctypes import * VCI...
Windows 64位系统下32位进程调用64位进程中的函数
最近研究了 一番,写了个命令行通用,支持使用CreateRemoteThread或RtlCreateUserThread+RtlExitUserThread 调用远程进程的指定模块DLL的函数: https://github.com/halx99/wow64helper另外推荐一款国外大神写的64位Windows 64位系统下32位程序调用64位模块代码的扩展库: https://github.c
小技巧分辨dll是64位还是32位
用Nodepad或sublime直接打开dll 在前几行里找PE关键字,紧接着后面会有D或L,这里D就是64位,L就是32位。
JNA调用32dll和64位dll的兼容解决
最近在学习jna,发现dll文件能能否成功调用取决于jdk位数。而且有个情况是位数不对应的话报的错是 "Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'testx64': 找不到指定的模块。" 它为什么是直接无视位数不符合的dll?仔细一想,代码搜寻dll文件时是按名字来的,那
解决System.Data.SQLite兼容32位和64位问题(无需指定处理器架构和客户机)
解决System.Data.SQLite兼容32位和64位问题 将当前说明文档的目录下的x64、x86目录和System.Data.SQLite.dll文件复制到您的应用程序根目录中(注意更新引用,引用System.Data.SQLite.dll即可,两目录中的不需要引用,但发布时需打包)。 如果是WEB网站,则复制到Bin目录下即可,发布时,也注意x64和x86一起打包发布 注意,当前的System.Data.SQLite.dll是完全的托管代码,不是混合程序集,文件大小为两百多KB, 如果你使用的是八百多KB以上的,说明你使用的是混合程序集,混合程序集是指定的处理器架构的,无法在不同架构下使用 所谓混合程序集的System.Date.SQLite指的是包含了托管的代码和Native的C/C++代码,本解决办法提供的System.Data.SQLite的为完全的托管 代码,必须配合Native Interop dll才能使用 注意:System.Data.SQLite必须是1.0.86.0及其以上版本
C# 写的32位COM组件,如何在64位系统上注册
之前,用c#写了一个COM组件,可以被Delphi的程序调用,而且已经使用在几个项目中,部署环境在XP和WIN7 32位都可以正常运行. 但最近一个项目,部署环境是WIN7 64位系统.使用写好的bat文件注册不成功, 运行到 RegAsm 时,总时提示 无法定位输入程序集 '....dll'或它的一个依赖项. 看了下RegAsm的命令: %WINDIR%\Microsoft.NE
VS2010实现64位代码调用32位模块方法
最近在做代码升级64位,因为有些第三方的模块没有源码,所以需要用到64位代码调用32位模块的方案,在网上找了很多资料和方法,最终参考国外的一篇文章解决了问题,原理是应用进程外com实现,具体见参考文献: https://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/。 现在为了更多的朋友少走弯路,这里把...
unity调用C++的DLL(32位和64位DLL)
参考网址:http://blog.csdn.net/penguin_whl/article/details/176166591、使用vs创建一个名为TestDll的win32控制台应用程序: 2、设置如下: 3、在头文件中新建一个文件:TestDll.h#ifndef _TEST_DLL_H_ #define _TEST_DLL_H_ #endif#if defined (EXPORTBUI
使用Java的JNative调用dll动态链接库
1,首先下载JNative的库,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so这三个包。       JNative.jar是需要导入到Java工程的lib下。 通过Build Path即可导入。 建议将JNative.jar放在jdk的jre\lib\ext文件里。       JNativeCpp.dll是必须放入到jdk的jre\lib
64位进程调用32位DLL实例
64位进程调用32位DLL实例,参考http://blog.csdn.net/nie2314550441/article/details/49867735
区分jdk 32位 64位
1.java -version 32位jdk  64位jdk    2.System.getProperty System.getProperty("sun.arch.data.model") 打印 32 或 64
7z.dll 32位 64位 7z.dll动态链接库
用于C#开发中,使之能通过7zip压缩解压的动态链接库。此压缩包包含32位、64位系统下的7z.dll库。
C#开发的WinForm程序自适应.Net2.0及.Net4.0(32位和64位版本)
将app.config文件的内容修改如下:<?xml version="1.0"?><configuration>  <startup useLegacyV2RuntimeActivationPolicy="true">    <supportedRuntime version="v4.0" sku=".NETFramework,Versio
怎样判断一个exe可执行程序(dll文件)是32位的还是64位的?
简便方法: 直接用记事本或者notepad++打开exe文件(dll文件),会有很多乱码,不要头疼,接下来只需要在第二段中找到PE两个字母,在其后的不远出会出现d? 或者L。若是d,则证明该程序是64位;若是L,则证明是32位。
System.Data.SQLite(32、64通用版本)
System.Data.SQLite(32、64通用版本) 该资源转载自:http://download.csdn.net/detail/yhbcpg/7924311
使用VS自带Dumpbin判断动态链接库.dll和应用程序.exe是32位还是64位
判断动态链接库.dll和应用程序.exe是32位还是64位
.c文件生成64/32位的.dll文件,同时Python调用c文件
Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。示例如下:实现两数求和的C代码,保存为add.c#include "stdio.h" __declspec(dllexport) int sum(int a, int b) { ...
32位程序注入64位dll到64位进程中失败
测试32位程序注入64位dll到64 位的进程中失败。出现下面错误提示: 应用程序发生异常 未知软件异常(0xc0000409)错误 必须4使用64位程序注入64位dll到64位的进程才能成功。 if (!DebuggerWasPresent) 0021DC04 83 3D A8 99 28 00 00 cmp         dword ptr [DebuggerWasPrese
OpenCV程序封装为64位DLL给Java调用
OpenCV程序封装为64位DLL给Java调用//最近两周一直在忙一件事,刚刚做完给Java调用成功了,Mark一下。 做图像处理的经常用到OpenCV这个第三方库,函数好写,打包不好打,尤其打包成64位dll时。下面就自己这段时期的工作,分享一下,如何封装为64位dll的,并且如何给Java调用的。 1,封装为64位DLL 首先要在win x64环境下,配置好属性。由于之前一直采用自己配置
C#中调用C++动态链接库DLL两者目标平台X64或X86必须保持一致
报错:试图加载格式不正确。程序在32位操作系统上运行正常,在64位操作系统上运行。 注意保持平台一致。 修改1 修改2  C#项目属性中——>目标平台
「C#」判断系统位数 64bit 32bit
- 姿势一 .net 4.0 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace ConsoleApplication9 { clas...
Matlab2015编译生成Dll并在VS2010环境下应用的具体操作步骤(64位系统)
背景:本人为一名运动控制方面的算法工程师,因为需要频繁运用MATLAB进行算法仿真,然后需要在实际系统中实现。发现MATLAB能够导出dll直接提供给vs2010使用,搜寻了很多资料,有的讲得不错,但是并不全面。摸索了一整天弄出来一个可行的方法,特此记录,与大家一起分享。 本人操作的软件环境:win7 (64位)+ MATLAB R2015b(64位)+ vs2010 成功运行