测试是否在客户端上安装了Crystal Reports for Visual Studio 2010(及更高版本)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试是否在客户端上安装了Crystal Reports for Visual Studio 2010(及更高版本)相关的知识,希望对你有一定的参考价值。

我继承了一个旧的Windows表单应用程序,其中包括使用Crystal报表生成PDF:s以进行打印。我正在尝试使用Crystal Reports for Visual Studio 2010组件而不是相同的旧版本,但我在检查客户端计算机上是否安装了所需的版本时遇到了问题。我希望即使没有安装Crystal也可以使用该应用程序,当然除了PDF生成之外。

该应用程序执行与此类似的操作(不包括不相关的详细信息):

try {
    ReportDocument report = new ReportDocument();

    //do something with the report, produce pdf etc
}
catch(Exception e) {
    Log.Write(e);
    throw();
}

然后在调用表单中再次捕获异常,而调用表单又显示一些信息,包括下载正确的Crystal安装文件的链接。

我认为这之前一直在工作,但是在我更新到Crystal组件之后13。#。#。#这已经不够了。 ReportDocument report = new ReportDocument();触发System.TypeInitializationException离开report为null。所以我没有什么可以随后处理的。然而,某些东西被创建,因为一段时间后,Finalizer运行,导致另一个System.TypeInitializationException被抛出,这反过来导致应用程序崩溃。

如何以不会在Finalizer线程上导致后续异常的方式运行new ReportDocument();之前测试Crystal是否已安装?

答案

尝试使用Reflection加载Type。这应该可以防止实例化,但可以验证是否可以创建Type。

另一答案

决定接受@PhillipH的回答,因为他指出了我的反思方向。但我仍然希望展示我实际做了什么。

我在ReportDocument report = new ReportDocument();线上获得的例外是(除其他事项外):

Could not load file or assembly 'CrystalDecisions.ReportAppServer.CommLayer, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304' or one of its dependencies. The system cannot find the file specified.

所以为了测试,我添加了这个:

            System.Reflection.Assembly a = System.Reflection.Assembly.ReflectionOnlyLoad("CrystalDecisions.ReportAppServer.CommLayer, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304");

在新的ReportDocument之前。当没有安装Crystal时,这将抛出,调用表单将捕获它并显示“Here's如何下载和安装Crystal”表单。

免责声明:我不习惯与Reflection合作,所以我不能说这是好还是完全愚蠢。似乎工作,改变后没有Finalizer错误。

另一答案

我只是检查装配路径:

If Not Directory.Exists(" C:WindowsassemblyGAC_MSILCrystalDecisions.CrystalReports.Engine") Then
        InstallCrystalRuntime()
     End If

以上是关于测试是否在客户端上安装了Crystal Reports for Visual Studio 2010(及更高版本)的主要内容,如果未能解决你的问题,请参考以下文章

crystal报告提示输入数据库凭据

Crystal Report PrintToPrinter方法无法在服务器上运行

如何将安装项目与 Crystal Reports 一起使用

数字公式在Crystal Reports中是否为十进制

.net 框架的 inno 设置检查 Sap Crystal 报告运行时引擎

Crystal Report 3of9条形码无法直接打印