使用sqlite的程序,怎么根据系统动态调用64位或者32位的dll

时间:2020-12-06 09:03:41
我有一个程序,用到了sqlite,但是它的dll是区分x86和x64的
部署的机器很多,有32位的,也有64位的,程序里应该怎么写,怎么动态调用相应的dll

5 个解决方案

#1


网上有的建议该anycpu为x86

我不想这样该,应该还有别的方法,请教大家了

#2


dllimport的时候,dll的路径不能传变量,麻烦点只能32和64位都写,程序启动的时候判断系统是多少位的,做一个标志位,后面根据标志位调用吧

#3


结贴
st_jar说的有理
但是实现起来,有一些现实的困难,在我的项目中

没办法,只能改x86了

#4


我也遇到同样的问题,顶

#5



C# SQLite 在32位和64位下自动切换不同的dll

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Management;
using System.IO;
namespace SqliteAuto
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
  
  
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            string dll32 = System.Windows.Forms.Application.StartupPath + "\\lib\\SQLite32.DLL";
            string dll64 = System.Windows.Forms.Application.StartupPath + "\\lib\\SQLite64.DLL";
            string dllpath = System.Windows.Forms.Application.StartupPath + "\\System.Data.SQLite.dll";
            if (Detect32or64() == "32")
            {
                // do 32bit things.
                try
                {
                    using (FileStream fs = File.Create(dllpath)) { }
                    File.Copy(dll32, dllpath, true);
                }
  
                catch
                {
                    Console.WriteLine("ERR");
                }
  
            }
            else if (Detect32or64() == "64")
            {
                //do 64bit things
                try
                {
                    using (FileStream fs = File.Create(dllpath)) { }
                    File.Copy(dll64, dllpath, true);
                }
  
                catch
                {
                    Console.WriteLine("ERR");
                }
            }
            Application.Run(new Form1());
        }
  
        private static string Detect32or64()
        {
            try
            {
                string addressWidth = String.Empty;
                ConnectionOptions mConnOption = new ConnectionOptions();
                ManagementScope mMs = new ManagementScope("\\\\localhost", mConnOption);
                ObjectQuery mQuery = new ObjectQuery("select AddressWidth from Win32_Processor");
                ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(mMs, mQuery);
                ManagementObjectCollection mObjectCollection = mSearcher.Get();
                foreach (ManagementObject mObject in mObjectCollection)
                {
                    addressWidth = mObject["AddressWidth"].ToString();
                }
                return addressWidth;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return String.Empty;
            }
        }
    }
}

#1


网上有的建议该anycpu为x86

我不想这样该,应该还有别的方法,请教大家了

#2


dllimport的时候,dll的路径不能传变量,麻烦点只能32和64位都写,程序启动的时候判断系统是多少位的,做一个标志位,后面根据标志位调用吧

#3


结贴
st_jar说的有理
但是实现起来,有一些现实的困难,在我的项目中

没办法,只能改x86了

#4


我也遇到同样的问题,顶

#5



C# SQLite 在32位和64位下自动切换不同的dll

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Management;
using System.IO;
namespace SqliteAuto
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
  
  
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            string dll32 = System.Windows.Forms.Application.StartupPath + "\\lib\\SQLite32.DLL";
            string dll64 = System.Windows.Forms.Application.StartupPath + "\\lib\\SQLite64.DLL";
            string dllpath = System.Windows.Forms.Application.StartupPath + "\\System.Data.SQLite.dll";
            if (Detect32or64() == "32")
            {
                // do 32bit things.
                try
                {
                    using (FileStream fs = File.Create(dllpath)) { }
                    File.Copy(dll32, dllpath, true);
                }
  
                catch
                {
                    Console.WriteLine("ERR");
                }
  
            }
            else if (Detect32or64() == "64")
            {
                //do 64bit things
                try
                {
                    using (FileStream fs = File.Create(dllpath)) { }
                    File.Copy(dll64, dllpath, true);
                }
  
                catch
                {
                    Console.WriteLine("ERR");
                }
            }
            Application.Run(new Form1());
        }
  
        private static string Detect32or64()
        {
            try
            {
                string addressWidth = String.Empty;
                ConnectionOptions mConnOption = new ConnectionOptions();
                ManagementScope mMs = new ManagementScope("\\\\localhost", mConnOption);
                ObjectQuery mQuery = new ObjectQuery("select AddressWidth from Win32_Processor");
                ManagementObjectSearcher mSearcher = new ManagementObjectSearcher(mMs, mQuery);
                ManagementObjectCollection mObjectCollection = mSearcher.Get();
                foreach (ManagementObject mObject in mObjectCollection)
                {
                    addressWidth = mObject["AddressWidth"].ToString();
                }
                return addressWidth;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return String.Empty;
            }
        }
    }
}