我了解为什么在 32 位和 64 位版本中提供 System.Data.SQLite.dll。因此,我们不要纠缠于此,继续前进。 :)
由于采用这种方式,纯 C# 开发似乎变得更加困难,需要做出 3 个选择。
是只支持32位并强制有托管
编译 x86 并处理在 32 或 64 中运行的程序集
位,这样就失去了 64 位的优势
环境。
就是强制64位,只支持64位,失去了
能够在 32 位上运行,但获得 64 位的所有优势。
是创建其程序集的两个版本,其中一个版本
编译 x86 并使用 32 位 SQLite 和另一个编译 x64
并使用 64 位 SQLite。它防止使用“ANY”作为编译选项
并且能够轻松地将单个构建部署到任一类型。它是
从发展的角度来看,管理起来并不像我们那么可怕
将需要两个项目。只有官方的 C# 代码在其中,
另一个只会使用另一个代码的“链接”。这
仅用于编译目的。仍然让我们不得不
管理两个输出以进行部署。
话虽如此,我只是想确认以上是唯一正确的选择。
但是,如果我忽略了其他选择,请告诉我。具体来说,是否有办法获得可以编译为 ANY 的单个 C# DLL,以便它可以根据其运行位置利用 32 或 64 位,并且仍然使用 System.Data.SQLite.dll。
这是 Springy76 答案的详细阐述。做这个:
public class AssemblyResolver
{
public static void HandleUnresovledAssemblies()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += currentDomain_AssemblyResolve;
}
private static Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == "System.Data.SQLite")
{
var path = Path.Combine(pathToWhereYourNativeFolderLives, "Native");
if (IntPtr.Size == 8) // or for .NET4 use Environment.Is64BitProcess
{
path = Path.Combine(path, "64");
}
else
{
path = Path.Combine(path, "32");
}
path = Path.Combine(path, "System.Data.SQLite.DLL");
Assembly assembly = Assembly.LoadFrom(path);
return assembly;
}
return null;
}
}
确保生成的路径指向 32 位或 64 位 SQLite Dll 的正确位置。就我个人而言,我在这个 NuGet 包中得到了很好的结果:http://www.nuget.org/packages/SQLitex64 http://www.nuget.org/packages/SQLitex64
(您只需要使用 NuGet 包来获取已编译的 SQLite Dlls。获得它们后,删除 NuGet 创建的项目中对 SQLite 的引用以及 NuGet 包本身。事实上,保留引用可以干扰此解决方案,因为 SQLite 永远不会被识别为未解析的程序集。)
尽早调用“HandleUnresolvedAssemblies()”,最好是在任何引导过程中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)