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

解决方案 »

  1.   

    网上有的建议该anycpu为x86我不想这样该,应该还有别的方法,请教大家了
      

  2.   

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

  3.   

    结贴
    st_jar说的有理
    但是实现起来,有一些现实的困难,在我的项目中没办法,只能改x86了
      

  4.   


    C# SQLite 在32位和64位下自动切换不同的dllusing 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;
                }
            }
        }
    }