调试时我可以成功连接到 SQLite 数据库。但是在构建 .NET 应用程序之后,SQLite 在使用时遇到了麻烦
system.IO.Path.Combine
:
at System.IO.Path.Combine(String path1, String path2)
at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
at LDF_DetectionTool.DatabaseConnector.GetApplicationsList() in SomePath\DatabaseConnector.cs:line 23
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SQLite;
using System.Data;
namespace LDF_DetectionTool
{
internal class DatabaseConnector
{
public List<string> GetApplicationsList()
{
string databaseFileName = "Databases\\LDF_DETECTION_TOOL_DATA.db";
string databaseFilePath = AppDomain.CurrentDomain.BaseDirectory + databaseFileName;
string connectionString = "Data Source=" + databaseFilePath;
List<string> applicationList = new List<string>();
try
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString, true))
{
connection.Open();
string query = "SELECT * FROM APPLICATIONS";
using (SQLiteCommand command = new SQLiteCommand(query, connection))
{
using (SQLiteDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
applicationList.Add(reader.GetString(0));
}
}
}
connection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(connectionString);
MessageBox.Show(ex.Message);
MessageBox.Show(ex.StackTrace);
}
return applicationList;
}
异常消息:
值不能为空。 (参数“路径1”)
没有一个变量为空(即使在构建之后,我也可以在消息框中显示它们)。构建后出现问题,但在调试时有效。数据库位于正确的位置。
我尝试重新安装 nuget 包,删除我自己使用的
Path.Combine
(已在上面的代码中消失),重建几次,重新启动 Visual Studio 并再次构建,并将 parseViaFramework
设置为 true 和 false(第 23 行的 new SQLiteConnection(connectionString, false)
) ).
我遇到了同样的问题。
当我在应用程序中使用
PublishSingleFile
为 csproj 指定 System.Data.SQLite.Core
属性时,似乎会发生这种情况。
结果,我通过将
IncludeNativeLibrariesForSelfExtract
属性设置为 true
来解决它。
正如 René 指出的那样,这似乎是
Assembly.GetExecutingAssembly().Location
的问题。在单一可执行发布格式中,无法检索程序集的当前路径,因为托管 DLL 被提取并加载到内存中。
下一页表示,通过将
IncludeNativeLibrariesForSelfExtract
属性设置为 true
,包括托管程序集的所有文件都将被提取到一个文件夹(可能是临时文件夹)。
https://learn.microsoft.com/en-us/dotnet/core/deploying/single-file/overview?tabs=cli
仅托管 DLL 与应用程序捆绑到单个可执行文件中。 当应用程序启动时,托管 DLL 被提取并加载到内存中, 避免提取到文件夹。 通过这种方法,托管二进制文件嵌入到单个文件包中, 但核心运行时本身的本机二进制文件是单独的文件。
要嵌入这些文件以进行提取并获得一个输出文件, 将属性 IncludeNativeLibrariesForSelfExtract 设置为 true。
指定 IncludeAllContentForSelfExtract 提取所有文件, 在运行可执行文件之前,包括托管程序集。 这可能有助于解决罕见的应用程序兼容性问题。
我几周前也遇到了同样的问题。
它寻找 Assembly.GetExecutingAssembly().Location。
我的代码位于单个文件 Windows 服务中,因此该位置是一个空字符串。
在调试时它不为空。
希望这有帮助。
我遇到了同样的问题,我将 IncludeNativeLibrariesForSelfExtract 设置为 true,但不起作用,同样的问题...有什么想法吗?