簡體   English   中英

UWP:部署使用SQLite和Dapper的項目

[英]UWP: Deployment of a project that uses SQLite and Dapper

為了能夠在我的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認證套件和其他stackoverflow答案中的建議在發行版配置上構建了它,但是問題仍然存在。

同樣在Windows App認證套件測試結果中,它表示

“在鏈接應用程序時,請應用所需的鏈接器選項-SAFESEH,DYNAMICBASE,NXCOMPAT和APPCONTAINER。

我正在使用VS 2019,並且鑒於該項目是用c#(不是c ++)編寫的,因此我不確定鏈接器選項是否適合我的情況。

另一個奇怪的事情是,與x86和x64軟件包不同,部署arm軟件包沒有問題。

這個問題可以解決嗎,還是我應該完全停止使用這些nuget軟件包。

看來目前尚不可能。 因此,讓我寫其他可能的解決方案以及我的經驗。

1-使用Microsoft.Data.SQLite

正如Xavier Xie在評論部分中建議的那樣,您可以在MSDN中使用本指南 它是UWP應用中用於SQLite的普通庫。

由於某些原因,我不喜歡這樣做。 在我看來,語法有點羅word,起步並不簡單。 您需要注意所安裝軟件包的版本。 更重要的是,在我的情況下,您需要隨着該類的字段的更改來更改該類的讀取和更新功能。 因此,與使用像Dapper這樣的高級庫相比,維護起來更困難。

2-使用實體框架

使用實體框架更易於維護,但我認為這很難入門。 我已經有一個數據庫,在這種情況下,文檔並不是那么有用。

3-使用與SQLite不同的方法進行數據存儲

因為我有一些初始數據,並且它不應該變得太大,所以我更喜歡使用json文件存儲和更新它們。

我使用Newtonsoft Nuget Package進行序列化,反序列化類,並使用ApplicationData類存儲數據。 我覺得它們都很簡單易用,並且有清晰的示例記錄在案。

這是我所做的一些代碼部分:

    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);
    }

我編寫了一個包裝類,用於使用ApplicationData類,以防萬一鏈接失效,下面是其中的一些代碼:

    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);
        }
    }

注意:我將選擇目前接受的答案。 如果出現解決確切問題的更好答案,我會接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM