c# - 在 32 位和 64 位 C# 世界中使用 System.Data.SQLite 的选项

标签 c# .net sqlite 32bit-64bit

我理解为什么在 32 位和 64 位版本中提供 System.Data.SQLite.dll。因此,让我们不要纠缠于此并继续前进。 :)

因为它是以这种方式完成的,所以它似乎使纯 C# 开发变得更加困难,因为要做出 3 个选择。

  1. 是只支持 32 位并强制在那里管理 程序集编译 x86 并处理在 32 或 64 中运行 位,当您使用 64 位时会失去优势 环境。

  2. 是强制64位,只支持64位,丢了 能够在 32 位上运行,但获得 64 位的所有优势。

  3. 是创建两个版本的程序集 编译 x86 并使用 32 位 SQLite 和另一个编译 x64 并使用 64 位 SQLite。它阻止使用“ANY”作为编译选项 并且能够轻松地将单个构建部署到任何一种类型。它的 从开发的角度来看,管理起来并不像我们那么可怕 将需要两个项目。只有一个正式的C#代码, 而另一个将只使用“链接”到另一个代码。这个 仅用于编译目的。仍然让我们不得不 管理用于部署的两个输出。

综上所述,我只是想确认以上是唯一正确的选择。

但是,如果我忽略了其他选择,请告诉我。具体来说,如果有办法获得一个可以编译为任何类型的 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

(您只需要使用 NuGet 包来获取已编译的 SQLite Dll。一旦您获得了它们,请删除由 NuGet 创建的项目中对 SQLite 的引用以及 NuGet 包本身。实际上,保留引用in place 可能会干扰此解决方案,因为 SQLite 永远不会被识别为未解析的程序集。)

尽早调用“HandleUnresolvedAssemblies()”,最好是在任何引导过程中。

关于c# - 在 32 位和 64 位 C# 世界中使用 System.Data.SQLite 的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264383/

相关文章:

c# - EF 迁移中的原始 SQL

android - 如何将数组中的值填充到 SQLite 数据库中

c# - 添加新项目时防止 ListView 自动水平滚动

c# - 返回与该项目相关的所有记录都具有特定条件的项目

c# - .Net 中的声明问题?

c# - 如何将自定义日志存储在使用diagnostics.wadcfg创建的Azure本地存储中

java - 将固定数据存储在 JSON 而不是 SQLite 中是否好

java - 错误 java.sql.SQLException : near "-": syntax error

c# - R# : Stop it touching ghostdoc XML comments on Code Cleanup?

c# - 在 C# 中计算重复日期的正确方法