请问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();
        }
    }
}

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

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

wh3845348
99887744 这样设置不行啊,Debug版本是测试包、Release版本是正式包。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问