[英]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時,出現以下錯誤:
文件C:\\ myApp \\ sni.dll無法通過AppContainerCheck檢查。
文件C:\\ myApp \\ SQLite.Interop.dll無法通過AppContainerCheck檢查。
此應用程序類型不支持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.