SQLite 的相对路径不适用于 WIX 工具集

我正在使用 SQLite 数据库并使用 WIX 工具集创建 WPF 应用程序的安装程序。问题是,当我直接从 Visual Studio 运行时,下面的相对路径可以正常工作,但当我使用 WIX 创建安装程序并且安装此安装程序运行程序后,它会为数据库文件提供致命错误。在项目目录中,我创建了一个数据库文件夹,数据库文件位于其中,如下图所示:

http://img3.mukewang.com/61e3bf30000112c006040521.jpg

通过 WIX Toolset 创建安装程序后,安装文件如下:

http://img1.mukewang.com/61e3bf41000148d408430313.jpg

inventory_control.db 文件路径:

http://img2.mukewang.com/61e3bf4c0001788808480150.jpg

dbConnectionString 路径:

http://img4.mukewang.com/61e3bf590001e17d04060261.jpg

我已经为相对路径连接字符串编写了代码,如下所示:


相对路径:


  string relativePath = @"Database\inventory_control.db";

        string currentPath = System.Reflection.Assembly.GetExecutingAssembly().Location;

        //string path = currentPath.Substring(0, currentPath.Length - 21);

        string path = Path.GetDirectoryName(currentPath);

        string absolutePath = System.IO.Path.Combine(path, relativePath);

        string dbConnectionString = string.Format("Data Source={0};Version=3;Pooling=True;Max Pool Size=100;", absolutePath);


        //string dbConnectionString = "Data Source=inventory_control.db";

        sQLiteConnection = new SQLiteConnection(dbConnectionString);

dbConnectionString给出正确的电流路径。当我直接从 Visual Studio 运行时,上面的相对路径工作正常,但当我使用 WIX 创建安装程序时不起作用。它给出了一个致命的错误。如何解决?


慕森王
浏览 210回答 1
1回答

ibeautiful

SQLite.Interop.dll:该文件SQLite.Interop.dll需要与其他运行时文件一起安装,以便 SQLite 正常运行。x86文件和x64格式有两种风格。可能建议将这两个文件安装在各自的文件夹中:您的安装文件夹层次结构 - 模型:YourBinary.exex86\SQLite.Interop.dllx64\SQLite.Interop.dllSystem.Data.SQLite.dllEtc...读写数据库位置:然后您的数据库应存储在可写路径中(或者您需要使用自定义 ACL 权限使普通用户可写路径 - 这绝不是一个好主意)。例外:显然try - catch你的数据库连接、更新和访问代码来检测这些类型的问题。文件夹混淆:数据库文件夹内是否有数据库文件?看起来inventory_control.db文件安装到主应用程序文件夹,而不是数据库子文件夹?也许该文件是由application.exe错误的文件夹中生成的?或者您可能出于测试目的复制了主文件夹中的文件?硬编码的 Dev-Box 原罪?: 里面写了什么Inventory Control.exe.config?那里是否有相关设置可以覆盖您的代码值?那里可能有硬编码的开发箱罪过吗?路径生成器:我假设您在启动期间已将应用程序的路径“装箱”,以确保它们是正确的?我喜欢复制路径并执行Start => Run并粘贴路径以查看它是否打开。CTRL + C当消息框显示时按下粘贴到记事本中。提取路径并在Start => Run.string path = currentPath.Substring(0, currentPath.Length - 21);.&nbsp;硬编码文件名中的字符数来获取父目录路径不是很健壮吗?你可以通过使用来改进它Path.GetDirectoryName(currentPath)吗?甚至可能:&nbsp;string dir = currentPath.Substring(0,currentPath.LastIndexOf('\\'));附加调试器和调试二进制文件?:也许您可以安装调试二进制文件并附加到它们以进行调试,如下所述:&nbsp;wix c# app doesn't launch after installed&nbsp;.&nbsp;只是为了获得真正的逐步调试会话。Path Spaces:数据库连接字符串。它的路径是否需要引号?如“带空格的路径”?您的 Visual Studio 项目的路径中可能没有任何空格,但安装时路径中有空格。你的源代码中的这个结构看起来很奇怪,为什么有必要?:<?define Inventory Control_TargetDir=$(var.Inventory Control.TargetDir)?>
打开App,查看更多内容
随时随地看视频慕课网APP