Visual Studio - 在一个包含System.Data.SQLite的项目中安装InstallShield设置

8
我有一个C#类库,引用了 System.Data.SQLite (来自nuget)。构建后,我的bin文件夹结构如下:
  • MyProject.dll
  • System.Data.SQLite.dll
  • x86/SQLite.Interop.dll
  • x64/SQLite.Interop.dll
System.Data.SQLite 需要 SQLite.Interop 才能运行,正确的dll在运行时被找到。然而,当我使用 InstallShield 生成包含项目主输出的安装程序时,x86和x64文件夹未被复制,导致我的应用程序无法运行。
有没有办法强制 Visual Studio 在主输出中包含x86和x64文件夹?
有没有办法在 InstallShield 中手动包含这些文件夹,并使用相对路径我的环境:
  • Visual Studio 2012专业版
  • Install Shield 2013 Limited Edition (免费)
  • System.Data.SQLite 1.0.96

那些听起来像是依赖项而不是主要输出,但请记住输出组仅供方便而非控制。如果您想完全控制您的设置,最好选择静态文件。 - Michael Urman
不幸的是,x64和x86文件夹由Nuget包管理,所以我找到的唯一方法是使用绝对路径。这个方法可行,但每个开发人员都需要在自己的计算机上配置它。如果我能够使用相对路径就好了,但我没有在免费版中找到如何实现。 - Rafael
1
@Rafael 只是让你知道。你可以手动更改 setup.isl 文件中的路径,从 c:\yourpath\packages\System.Data.SQLite.Core.1.0.94.0\build\net40\x86\SQLite.Interop.dll<ISProjectFolder>..\packages\System.Data.SQLite.Core.1.0.94.0\build\net40\x86\SQLite.Interop.dll(或者你 SQLite.Interop 所在的任何位置)。 - Markus
1
我希望你已经尝试过在设置中更改目标平台为64位或32位,而不是使用Any CPU来强制使用x86或x64。(解决方案资源管理器->右键单击项目->属性->生成) - Suriya
还要检查输出路径。请参阅 https://dev59.com/d4Hba4cB1Zd3GeqPWtgY 以获取更多详细信息。 - Suriya
2个回答

0

我在使用VS2013 / Installshield LE时遇到了同样的问题;最终我选择更改我的NuGet包,使其在构建文件夹下不创建SQLite.interop.dll的x86文件夹。

要做到这一点,请查看项目目录下的“packages\System.Data.SQLite.Core.1.0.104.0\build”文件夹。然后选择与您正在针对的.NET版本相关的子文件夹,并在文本编辑器中打开“System.Data.SQLite.Core.targets”文件。您需要删除所有对“%(RecursiveDir)”的引用,除了“SQLite Interop Library Content Items”部分之外。保存、清理和重建 - interop dll现在应该在与主可执行文件/等同级的文件夹中,并且Installshield应该能够自动将其包含为依赖项。

如果它没有出现在正确的位置,请尝试编辑不同的.NET版本的.target文件,直到找到正确的文件。


0

是的,有一种方法可以通过InstallShield添加/部署文件夹。在“文件”选项卡下,您可以添加文件/文件夹。在添加这些文件时,您还可以设置相对路径。只需设置一个带有路径的属性,并在相对路径中使用该属性。因此,您可以通过InstallShield添加文件夹结构并在其中添加文件,以便将这些文件复制到哪里(DLL的引用位置)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接