我有一个使用Crystal Reports的.NET项目。应用程序使用ClickOnce分发。如果用户在他们的计算机上安装了Crystal,那么事情就会很好。但是,并非所有最终用户都在其计算机上安装了Crystal Reports。这些用户收到以下错误...
“无法安装或运行应用程序。应用程序要求首先在全局程序集缓存(GAC)中安装程序集CrystalDecisions.ReportAppServer.XmlSerialize版本10.5.3700.0。”
有没有办法强制ClickOnce安装以确保安装了先决条件?
答案 0 :(得分:11)
没有。 ClickOnce和先决条件存在很多混淆。
ClickOnce使用prereqs nothing 。没有。 ClickOnce将文件从服务器复制到客户端的计算机,并在更新服务器文件时保持这些文件同步 - 就是这样。它无法将内容放入GAC,注册dll,安装msi文件等等。
当您使用Visual Studio进行部署时,会出现混淆。当您发布与ClickOnce无关时,VS会为您做几件事。首先,它为您创建了一个很好的html页面,其中包含一些指向部署的链接。此外,它允许您从几个先决条件中选择,并将为您创建一个bootstrapper exe。我假设你为Crystal Reports安装做了这个。引导程序只是管理多个先决条件的简单方法。在安装您的应用程序之前,引导程序不是告诉您的用户安装X,然后是Y,然后是Z,而是让这三个安装“无缝”,因此它们看起来好像是一个大的安装。如果用户已经安装了它,它也可以跳过prereq安装。
如果你注意VS生成的html页面,你可以看到两个链接。一个到你的.application文件(ClickOnce部署),一个到bootstrapper exe。您几乎完全受用户的支配,并且必须依赖它们来阅读页面并在需要时运行引导程序。一个例外是.Net Framework,因为html页面可以通过UserAgent字符串检查它。
如果他们不运行引导程序,他们将会得到与您所询问的错误非常相似的错误。
一种可能的解决方案是编写代码以检查它是否已安装。它可以检查注册表或“Program Files”文件夹;无论你需要做什么来确保它已安装。然后优雅地退出并通知用户他们是否没有它。只要在尝试加载和使用Crystal程序集之前进行检查,这将起作用。
祝你好运!如果您想出更好的解决方案,请回复。答案 1 :(得分:-1)
在先决条件中,选择.Net Framework的Crystal Report(不是Visual Studio的Crystal Report)并发布。