使用ClickOnce创建单个安装文件

时间:2014-02-03 08:43:05

标签: c# winforms clickonce

我创建了一个Windows窗体应用程序并使用ClickOnce发布它。它使用应用程序文件生成了安装文件,并且它也适用于更新检查。

但是在“Application Files”文件夹中,它显示了我使用过的所有DLL文件的已部署文件。向用户显示这些dll名称毫无意义,我不想透露我使用过的那些DLL文件。那么是否可以只向用户提供设置文件,以及之前执行的操作?

我正在使用Visual Studio 2013 Express Edition(桌面版)。或者ClickOnce的另一种方式?但我发现ClickOnce是最好的。

我尝试了Ilmerge,但它没有合并Sqlite.Interop.dll并且正在抛出错误。在研究了很多之后,我发现问题出在SQLite本身。

2 个答案:

答案 0 :(得分:4)

您应该围绕ClickOnce创建一个包装器设置。

  • 将所有文件解压缩到临时目录
  • 从temp dir运行Setup.exe

我为此目的使用InnoSetup,这是开源的

基本设置可能如下所示:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "..."
#define MyAppVersion "1"
#define MyAppPublisher "..."
#define MyAppURL "http://..."
#define MyAppExeName "setup.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.     
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{...-...-...-....-.........}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
CreateAppDir=no
LicenseFile={#SourcePath}resources\license.txt
OutputDir={#SourcePath}setup\disk
OutputBaseFilename=setup
SetupIconFile={#SourcePath}resources\app.ico
WizardImageFile={#SourcePath}resources\app.bmp
WizardSmallImageFile={#SourcePath}resources\app.bmp
Compression=lzma
SolidCompression=yes
Uninstallable=no
DisableFinishedPage=yes
;PrivilegesRequired=none

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"

[Files]
Source: {#SourcePath}files\*; DestDir: "{tmp}"; Flags: ignoreversion

[Run]
Filename: {tmp}\setup.exe; Parameters: "install"

注意:{#SourcePath}files\*应指向setup.exe / MyApp.application文件和Application Files文件夹所在的目录。 不是测试,但应该给你一个良好的开端。

结果是一个包含您需要的所有内容的exe文件。 在创建新设置之前,不要忘记清理ClickOnce目录,否则Application Files文件夹也将包含最新版本。

答案 1 :(得分:1)

由于我已经对上述内容进行了一些改进,因此我会向所有关注的人发布此内容。

以上代码运作良好,但值得注意以下事项:

您可能需要在上面给出的代码中更改对{tmp}的引用。 InnoSetup在安装完成后删除{tmp}文件夹,对我而言,这导致ClickOnce安装程序崩溃并丢失文件错误。

也可能想考虑添加:Flags:" postinstall"参数:" install&#34 ;;我的应用程序在从InnoSetup启动时不允许拖放,直到我添加它。

最后,我必须在files部分的树结构中明确列出每个文件夹。复制到目标文件夹时使用*不保留此选项(复制时它或完全忽略文件夹)。可能有一个InnoSetup选项/标志可以使这项工作,但我没有调查它。

[Files]
Source: "{#SourcePath1}\*"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#SourcePath1}\Application Files\MyApp\*"; DestDir: "{app}\Application Files\MyApp"; Flags: ignoreversion
Source: "{#SourcePath1}\Application Files\MyApp\Resources\*"; DestDir: "{app}\Application Files\MyApp\Resources"; Flags: ignoreversion