测试是否在客户端上安装了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 Report PrintToPrinter方法无法在服务器上运行