我创建了一个构建Crystal报表并在报表查看器中显示它的类。
但是,如果没有Crystal Redistributable,代码会崩溃。如何以编程方式检测最终用户是否安装了Crystal DLL?
我需要包含的代码是:
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
答案 0 :(得分:1)
理想情况下,您将在安装时处理应用程序的所有依赖项,并确保已安装所有必需的组件。但是,您可以在try..catch块中包装调用DLL的代码,并在抛出时捕获DllNotFoundException。
答案 1 :(得分:1)
我想Crystal会安装到GAC。 因此,您需要以编程方式浏览全局程序集缓存并在那里查找Crystal程序集
GAC可以通过Windows API以编程方式进行管理。 Here you will find一个简单的包装器,允许从托管代码管理GAC
但我不建议你这样做。 :)强>
在安装软件期间,通常也要检查所有必需的程序集,我认为Windows Installer具有检查程序集的功能
然而,并非总是如此。 假设您希望用户在没有Crystal的情况下运行程序,但如果未安装Crystal,则不允许显示报告。
在这种情况下,您应该将所有报表功能与其他表单分离。您应该使用Crystal Reports功能创建一个单独的项目,我们称之为MyReports。只有那个项目应该引用Crystal程序集,而其他项不应该引用。其他项目也不应该直接引用MyReports。
最后,您应该使用反射来调用从其他项目在MyReports中实现的报表查看器。
通常,您将在将使用反射从文件加载MyReports程序集的过程中编写try / catch。因此,如果Crystal或其他东西不存在,它将抛出异常,您将显示给用户,但程序的其他部分将起作用。
此外,您可以阅读依赖注入设计模式,它有助于管理此类问题。
答案 2 :(得分:1)
您可以检查以下注册表项是否存在
HKEY_CURRENT_USER\Software\Crystal Decisions
这将告诉您是否安装了水晶报告。如果要检查特定版本,请检查子键。例如,随Visual Studio 2008安装的水晶报告是10.2
答案 3 :(得分:0)
您可以通过查看注册表找到这些详细信息。我会搜索并提供更新。
编辑:您还可以将Crystal报表作为部署包中的先决条件。然后,您可以确保最终用户拥有该库。
答案 4 :(得分:0)
在您的设置中使用merge module。 Sap有一个清单: