部署的机器很多,有32位的,也有64位的,程序里应该怎么写,怎么动态调用相应的dll
5 个解决方案
#1
网上有的建议该anycpu为x86
我不想这样该,应该还有别的方法,请教大家了
我不想这样该,应该还有别的方法,请教大家了
#2
dllimport的时候,dll的路径不能传变量,麻烦点只能32和64位都写,程序启动的时候判断系统是多少位的,做一个标志位,后面根据标志位调用吧
#3
结贴
st_jar说的有理
但是实现起来,有一些现实的困难,在我的项目中
没办法,只能改x86了
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了
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;
}
}
}
}