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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLite的相对路径不适用于WIX工具集相关的知识,希望对你有一定的参考价值。

我正在使用SQLite数据库并使用WIX Toolset创建WPF应用程序的安装程序。问题是,当我从Visual Studio直接运行时,下面的相对路径工作正常,但是当我使用WIX创建安装程序时无法正常工作,并且在安装此安装程序后运行程序然后它会给数据库文件带来致命错误。在Project目录中,我创建了一个Database文件夹,其中包含数据库文件,如下图所示:

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

inventory_control.db文件路径:

dbConnectionString路径:

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

相对路径:

  string relativePath = @"Databaseinventory_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创建安装程序时,上述相对路径不起作用。它给出了一个致命的错误。怎么解决?

WIX文件:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"><?define Inventory Control_TargetDir=$(var.Inventory Control.TargetDir)?>
    <Product Id="f941ba49-4369-44d4-aa0c-b77f20aa41db" Name="Inventory Control" Language="1033" Version="1.0.0.0" Manufacturer="devtros.com" UpgradeCode="ce092371-53cc-4be9-ab5d-c7a2685af970">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <Icon Id="app_icon.ico" SourceFile="$(var.ProjectDir)app_icon.ico" />
    <Property Id="ARPPRODUCTION" Value="app_icon.ico" />

    <WixVariable Id="WixUIBannerBmp" Value="Imagesackground.bmp" />
    <WixVariable Id="WixUIDialogBmp" Value="Imagesackground.bmp" />
    <WixVariable Id="WixUILicenseRtf" Value="$(var.ProjectDir)License.rtf" />

    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
    <UIRef Id="WixUI_InstallDir" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes" />

        <Feature Id="ProductFeature" Title="Inventory Control" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
      <ComponentRef Id="ApplicationShortcut" />
      <ComponentRef Id="ApplicationShortcutDesktop" />
            <ComponentGroupRef Id="Database_files" />
        </Feature>
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="Inventory Control">
          <Directory Id="Files" Name="Files" />
          <Directory Id="Database" Name="Database" />
        </Directory>
            </Directory>
      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Inventory Control" />
      </Directory>
      <Directory Id="DesktopFolder" Name="Desktop" />
        </Directory>
    </Fragment>

  <Fragment>
    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="ApplicationShortcut" Guid="9bd13330-6540-406f-a3a8-d7f7c69ae7f9">
        <Shortcut Id="ApplicationStartMenuShortcut" Name="Inventory Control" Description="Inventory Control" Target="[INSTALLFOLDER]Inventory Control.exe" WorkingDirectory="INSTALLFOLDER" />
        <RemoveFolder Id="RemoveApplicationProgramsFolder" Directory="ApplicationProgramsFolder" On="uninstall" />
        <RegistryValue Root="HKCU" Key="SoftwareInventory Control" Name="installed" Type="integer" Value="1" KeyPath="yes" />
      </Component>
    </DirectoryRef>
    <DirectoryRef Id="DesktopFolder">
      <Component Id="ApplicationShortcutDesktop" Guid="cde1e030-eb64-49a5-b7b8-400b379c2d1a">
        <Shortcut Id="ApplicationDesktopShortcut" Name="Inventory Control" Description="Inventory Control" Target="[INSTALLFOLDER]Inventory Control.exe" WorkingDirectory="INSTALLFOLDER" />
        <RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall" />
        <RegistryValue Root="HKCU" Key="SoftwareInventory Control" Name="installed" Type="integer" Value="1" KeyPath="yes" />
      </Component>
    </DirectoryRef>
  </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
            <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
            <!-- <Component Id="ProductComponent"> -->
                <!-- TODO: Insert files, registry keys, and other resources here. -->
            <!-- </Component> -->
            <Component Id="Inventory_Control.exe" Guid="0a7e7061-201b-4d49-adeb-4449e9c4da3e">
              <File Id="Inventory_Control.exe" Name="Inventory Control.exe" Source="$(var.Inventory Control_TargetDir)Inventory Control.exe" />
            </Component>
            <Component Id="Inventory_Control.exe.config" Guid="28323615-8159-4116-b1ac-e29a70bf2593">
              <File Id="Inventory_Control.exe.config" Name="Inventory Control.exe.config" Source="$(var.Inventory Control_TargetDir)Inventory Control.exe.config" />
            </Component>
            <Component Id="System.Windows.Controls.Input.Toolkit.dll" Guid="7d678201-767a-416b-b645-b2cb7d514893">
              <File Id="System.Windows.Controls.Input.Toolkit.dll" Name="System.Windows.Controls.Input.Toolkit.dll" Source="$(var.Inventory Control_TargetDir)System.Windows.Controls.Input.Toolkit.dll" />
            </Component>
            <Component Id="System.Data.SQLite.dll" Guid="178a5aef-c027-4215-81ae-f148ab6cd472">
              <File Id="System.Data.SQLite.dll" Name="System.Data.SQLite.dll" Source="$(var.Inventory Control_TargetDir)System.Data.SQLite.dll" />
            </Component>
            <Component Id="Zen.Barcode.Core.dll" Guid="20e34fc3-0066-4ffd-b401-518bc1177098">
              <File Id="Zen.Barcode.Core.dll" Name="Zen.Barcode.Core.dll" Source="$(var.Inventory Control_TargetDir)Zen.Barcode.Core.dll" />
            </Component>
            <Component Id="WPFToolkit.dll" Guid="8d974e65-defb-4675-b9e0-ff617e5ab1da">
              <File Id="WPFToolkit.dll" Name="WPFToolkit.dll" Source="$(var.Inventory Control_TargetDir)WPFToolkit.dll" />
            </Component>
        </ComponentGroup>
    </Fragment>

  <Fragment>
    <ComponentGroup Id="Database_files" Directory="Database">
      <Component Id="Database_inventory_control.db" Guid="0104b919-0aa9-4dc5-9492-14c474d97cf1">
        <File Id="Database_inventory_control.db" Name="inventory_control.db" Source="$(var.Inventory Control_TargetDir)Databaseinventory_control.db" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>
答案

SQLite.Interop.dll:文件SQLite.Interop.dll需要与其余的运行时文件一起安装,以便SQLite正常运行。

该文件有两种,x86x64格式。建议将两个文件安装在各自的文件夹中:

您的安装文件夹层次结构 - 模拟:

  • YourBinary.exe
  • x86SQLite.Interop.dll
  • x64SQLite.Interop.dll
  • System.Data.SQLite.dll
  • Etc...

读写数据库位置:然后您的数据库应存储在可写路径中(或者您需要使用自定义ACL权限使常规用户可写入路径 - 这绝不是一个好主意)。

例外:显然try - catch您的数据库连接,更新和访问代码以检测这些类型的问题。


  1. 文件夹混淆:数据库文件夹中是否有数据库文件?它有点像inventory_control.db文件安装到主应用程序文件夹,而不是那个数据库子文件夹? 也许该文件是由application.exe在错误的文件夹中生成的? 或者您可能在主文件夹中复制了文件以进行测试?
  2. 硬编码的Dev-Box罪孽?:在Inventory Control.exe.config中它说了些什么? 那里是否有可以覆盖代码值的相关设置? 那里会有一个硬编码的开发盒罪吗?
  3. 路径构建器:我假设您在启动过程中有来自应用程序的路径的“消息框”,以确保它们是正确的?我喜欢复制路径并做一个Start => Run并粘贴路径以查看它打开。消息框显示时按CTRL + C。粘贴到记事本中。提取路径并在Start => Run中尝试。 string path = currentPath.Substring(0, currentPath.Length - 21);。为了获取父目录路径,硬编码文件名中的字符数并不是很健壮吗? 你能用Path.GetDirectoryName(currentPath)改进它吗? 或者甚至可能:string dir = currentPath.Substring(0,currentPath.LastIndexOf('\'));
  4. 附加调试器和调试二进制文件?:也许你可以安装调试二进制文件并附加到它们进行调试,如下所述:wix c# app doesn't launch after installing。只是为了获得真正的逐步调试会话。
  5. 路径空间:该数据库连接字符串。它的路径需要引用吗?在“有空间的路径”中? Visual Studio项目的路径中可能没有任何空格,但安装后路径中有空格。

你的源码中的这个构造看起来很奇怪,为什么有必要?:

  • <?define Inventory Control_TargetDir=$(var.Inventory Control.TargetDir)?>

以上是关于SQLite的相对路径不适用于WIX工具集的主要内容,如果未能解决你的问题,请参考以下文章

FileInputStream 不适用于相对路径[关闭]

字体的相对路径不适用于 sass-loader

php require() 不适用于相对或完整

在 WiX 3.7 中结合绝对路径和相对路径

主题不适用于片段

Wix 工具集 - 参考二进制文件 - 单独的 wxs 文件