【问题标题】:UWP: Deployment of a project that uses SQLite and DapperUWP:部署使用 SQLite 和 Dapper 的项目
【发布时间】:2019-12-05 17:22:45
【问题描述】:

为了能够在我的 UWP 项目中使用 SQLite,我添加了 Nuget 包 System.Data.SQLite.Core 1.0.111 和 Dapper 1.60.6。它可以完美地构建和运行。但是,当我尝试将此项目部署到 Store 时,我得到了这些错误:

Windows 安全功能测试

文件 C:\myApp\sni.dll 未能通过 AppContainerCheck 检查。
文件 C:\myApp\SQLite.Interop.dll 未能通过 AppContainerCheck 检查。

支持的 API 测试

此功能不支持 advapi32.dll 中的 API CryptDuplicateKey 申请类型。 SQLite.Interop.dll 调用此 API。
不支持 kernel32.dll 中的 API AreFileApisANSI 申请类型。 SQLite.Interop.dll 调用此 API。
...

我检查了“使用本机工具链编译”选项,并按照 Windows App Certification Kit 和另一个 stackoverflow 答案中的建议在发布配置上构建它,但问题仍然存在。

它也在 Windows 应用程序认证工具包测试结果中显示

"应用所需的链接器选项 - SAFESEH、DYNAMICBASE、NXCOMPAT、 和 APPCONTAINER - 当您链接应用程序时。”

我正在使用 VS 2019,并且鉴于该项目是用 c#(不是 c++)编写的,我不确定链接器选项是否适用于我的情况。

另外一个奇怪的是,不像x86和x64包,部署arm包没有问题。

这个问题是否可以解决,或者我应该完全停止使用这些 nuget 包。

【问题讨论】:

  • 您是否在本地 WACK 中遇到过这些错误?
  • 是的。实际上第二部分,Supported Api Test,我猜只出现在本地 WACK 中,但不确定。
  • 不幸的是,在线 WACK 也没有通过包。它像 WACK 一样给出第一个错误,但这次第二个错误没有那么严重。
  • 它对 sni.dll 有很多抱怨
  • Nuget 上的 Dapper 和 SQLite 库似乎是最新的。 Nuget Manager 是否为 UWP 过滤包?我认为我们可以使用我们在 nuget 包管理器上看到的包。

标签: c# sqlite uwp windows-store-apps dapper


【解决方案1】:

目前看来是不可能了。所以让我写下其他可能的解决方案和我的经验。

1 - 使用Microsoft.Data.SQLite

正如 Xavier Xie 在评论部分所建议的,您可以使用this guide in MSDN。它是一种用于在 UWP 应用中使用 SQLite 的普通库。

出于几个原因,我不喜欢这个。在我看来,它的语法有点冗长,而且入门并不容易。您需要注意您安装的软件包的版本。更重要的是,在我的情况下,您需要更改类的读取和更新函数,因为该类的字段发生变化。因此,与使用 Dapper 等更高级别的库相比,它更难维护。

2 - 使用实体框架

Using entity framework 维护起来比较简单,但是我觉得很难上手。我已经有一个数据库,在这种情况下文档没有那么有用。

3 - 使用不同于 SQLite 的方法进行数据存储

因为我有一些初始数据,而且它不应该变得这么大,所以我更喜欢使用 json 文件来存储和更新它们。

我使用Newtonsoft Nuget Package 进行序列化、反序列化类,并使用ApplicationData Class 存储数据。我认为它们都非常易于使用,并且带有清晰的示例。

这是我所做的部分代码:

    const string myDataFilename= "myData.json";
    const string backupFolderPath = "ms-appx:///DataModel/";

    async Task LoadData()
    {
        string json = await StorageApi.ReadFromFile(myDataFilename, backupFolderPath + myClassFilename);
        try
        {
            myList = JsonConvert.DeserializeObject<List<myClass>>(json);
        }
        catch
        {
            // maybe do some reset logic here
            await StorageApi.CopyFile(backupFolderPath + myDataFilename, myDataFilename);
            await LoadData();
        }
    }
    
    async public void saveData()
    {
        string json = JsonConvert.SerializeObject(myList);
        await StorageApi.WriteToFile(myDataFilename, json);
    }

我写了a wrapper class for using ApplicationData class 以防链接失效,这里有一些代码:

    public static async Task WriteToFile(string relativePath, string data)
    {
        StorageFile sampleFile = await localFolder.CreateFileAsync(relativePath,
            CreationCollisionOption.ReplaceExisting);
        await FileIO.WriteTextAsync(sampleFile, data);
    }

    // Read data from a file
    public static async Task<string> ReadFromFile(string relativePath, string backupPath = "")
    {
        try
        {
            StorageFile sampleFile = await localFolder.GetFileAsync(relativePath);
            return await FileIO.ReadTextAsync(sampleFile);
        }
        catch (FileNotFoundException e)
        {
            Debug.WriteLine( "Relative path: {0}, backupPath: {1}, Error str: {2}", relativePath, backupPath, e.Message);

            if (backupPath == "")
                return "";
            else
            {
                await CopyFile(backupPath, relativePath);
                return await ReadFromFile(relativePath);
            }
        }
        catch (IOException e)
        {
            Debug.WriteLine(e.Message);
        }

        return "";
    }

    public static async Task CopyFile(string src, string relativeDst)
    {
        try
        {
            StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(
                new Uri(src));
            await file.CopyAsync(localFolder, relativeDst, NameCollisionOption.ReplaceExisting);
        }
        catch (FileNotFoundException e)
        {
            Debug.WriteLine(e.Message);
        }
        catch (IOException e)
        {
            Debug.WriteLine(e.Message);
        }
    }

注意:我将选择此答案作为现在接受的答案。如果出现解决确切问题的更好答案,我会接受它。

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 2016-12-05
    • 2018-04-23
    • 2017-11-09
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多