解决ClickOnce应用程序发布时,可能出现的缺少GAC文件问题
客户端运行ClickOnce应用程序时,有可能会出现如下错误:
这是由于在客户端的GAC(全局程序集缓存)中,缺少相应的dll文件。这些Dll文件一般是第三方类库,或是一些系统库,本来需要客户端自己安装的,但客户端没有安装这些dll文件,最终导致我们的应用程序无法运行。
因此我们要帮客户装上这些东西。
ClickOnce应用程序和Windows Installer应用程序不同,客户不需要安装就能运行。但带来的不便之处是,我们在运行ClickOnce应用程序时,不能像运行Windows Installer那样在ClickOnce中把这些缺少的dll文件安装到GAC目录下。
所幸可以通过发布选项中的Prerequisites来解决这个问题。
以下是详细过程
制作Windows Installer安装程序
首先我们需要某种办法,把缺少的文件复制到客户端的GAC里,最简单的就是编写一个Windows Installer安装程序了:
在解决方案资源管理器里,选择View->File System,然后添加Global Assembly Cached Folder目录:
进入Global Assembly Cached Folder,选择Add File,添加客户端缺少的dll文件:
PS,如果应用程序还需要注册COM组件,也可以在安装程序里完成。添加几个COM组件,并在属性选项里选择Register为vsdrfCOMSelfReg,安装程序运行时会自动帮我们注册这些COM组件:
将Installer添加到Prerequisites里
进入目录:C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages(有可能是其他目录),我们新建一个文件夹Rabbit Installer:
把上一步编译的安装程序复制到该文件夹下,编写Products.xml和package.xml文件(为了方便,可以从其他目录——例如Windows Installer目录——复制Products.xml文件到本文件夹下):
Product.xml看起来应该是这样的:
<?xml version="1.0" encoding="utf-8" ?> <Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="Rabbit Installer" > <PackageFiles CopyAllPackageFiles="true"> <PackageFile Name="RabbitSetup.msi" /> <PackageFile Name="setup.exe" /> </PackageFiles> <Commands Reboot="Immediate"> <Command PackageFile="setup.exe"> <ExitCodes> <ExitCode Value="0" Result="Success"/> <ExitCode Value="1641" Result="SuccessReboot"/> <ExitCode Value="3010" Result="SuccessReboot"/> <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" /> </ExitCodes> </Command> </Commands
Package.Xml看起来是这样的:
<?xml version="1.0" encoding="utf-8" ?> <Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" Name="DisplayName" Culture="Culture" > <Strings> <String Name="DisplayName">Rabbit Browser Installer</String> </Strings> </Package>
添加到Prerequisites
完成以上步骤后,我们就可以在Prerequisites里添加Rabbit Browser Installer了:
测试
从新发布后,客户端将提示,需要Rabbit Browser Installer:
点击Run,开始安装:
完成后,再运行客户端,问题解决!