“CrystalDecisions.CrystalReports.Engine.ReportDocument”的类型初始化程序引发了异常。”

43

我正在将一个使用Crystal Reports API显示和打印表单的桌面应用程序部署给我的客户。我正在使用InstallShield 2012构建我的安装程序,并已包含.NET 4.0 Framework以及所有Crystal程序集。我有两个(有点相关的)问题:

1)每当我尝试在客户机上运行应用程序时,会收到以下错误:

The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' 
      threw an exception.

我不知道我在这里遗漏了什么。 CrystalDecisions.CrystalReports.Engine dll被正确地注册到GAC中,大约还有其他10个Crystal程序集。

2) 我在SAP论坛上提出了这个问题,并且被告知需要将.NET 2.0 Framework与.NET 4.0 Framework一起包含。 我尝试在我的安装程序中包含.NET 2.0 redistributable,但安装程序不会安装它。 安装程序是否看到我已经安装了4.0,因此跳过了2.0的安装?

21个回答

24

以下是我用过的方法:

如果您正在64位机器上安装,请确保在“生成”选项卡下应用程序属性中选择“Any CPU”作为平台目标,并取消选中“Prefer 32-bit”复选框(如果有该选项)。Crystal对于32/64位程序集非常敏感,并做出一些相当反直觉的假设,这些假设非常难以进行故障排除。


我的解决方案是不使用Crystal想要的正确的log4net程序集。我在我的应用程序中使用log4net来记录自己的异常,但是Crystal想要一个具有不同PublicKeyToken的log4net版本。一旦我在我的安装程序中包含了正确的版本,它就可以工作了。 - gwin003
2
我看过SAP文档,明确指定将其设置为32位或64位,而不是AnyCpu。 - Paul Zahra

17

静态构造函数抛出异常时,会被封装在一个TypeInitializationException中。您需要检查异常对象的InnerException属性来查看实际的异常。

在一个暂存/生产环境(没有安装Visual Studio的地方),您需要:

  1. 跟踪/记录异常及其InnerException(递归):将事件处理程序添加到AppDomain.UnhandledException事件中,并在那里放置您的日志/跟踪代码。使用System.Diagnostics.Debug.WriteLine进行跟踪,或使用记录器(log4net、ETW)。DbgView(一种Sysinternals工具)可用于查看Debug.WriteLine跟踪。
  2. 使用生产调试器(如WinDbg或NTSD)诊断异常。
  3. 使用Visual Studio的远程调试来诊断异常(使您能够从自己的开发计算机上对目标计算机上的代码进行调试)。

谢谢,这让我找对了方向。我已经实现了自己的异常日志记录,但是我没有正确地记录InnerExceptions。 - gwin003
嘿!伙计,这是因为缺乏能力导致的...如果你查看内部异常,你会看到这个消息“拒绝访问。访问语音功能需要在清单中定义ID_CAP_SPEECH_RECOGNITION。”所以为了摆脱这个异常,请按照说明打开语音识别的功能。 - Zia Ur Rahman

11

我曾经遇到过类似的消息,在网上搜索了几次并尝试了所有建议,但都没有起作用。最终我找到了解决方案。 在我的IIS服务器中,在应用程序池高级选项下,有一个名为“启用32位应用程序”的选项 - 将其从False更改为True,并重新启动IIS服务器后,我的程序开始生成PDF文件。


9

请检查您的项目属性和平台目标。然后安装相应版本的Crystal Reports:

To x86 > CRforVS_redist_install_32bit
To x64 > CRforVS_redist_install_64bit

4
您是在说需要安装那个应用程序吗?我有点难以解析您所写的内容。如果您能澄清一下,那就太好了。 - Lizz

7

如果您正在使用Visual Studio,则启用生成属性“Prefer 32-bit”。

请参见下面的图片。

输入图像描述


1
我知道这是一个旧帖子,但对我来说却相反,生产服务器上的运行时是x64,并且我在VS2015解决方案的平台目标选项中勾选了“首选32位”。我不得不取消勾选它,然后它就可以工作了!无论如何,感谢提议,它让我免于再花费更多时间或拔掉头发 :)。 - GwenGuts

6

这个 bug 的内部异常信息说:无法加载文件或程序集“log4net,版本=1.2.10.0,Culture=neutral,PublicKeyToken=692fbea5521e1304”

将 AppPool 设置中的 启用 32 位应用程序 改为 False 可以解决这个问题。


3
同样的情况,在开发者机器上应用程序运行良好,但在部署时抛出异常“crystaldecisions.crystalreports.engine.reportdocument threw an exception” 详情:sys.io.filenotfoundexcep crystaldecisions.reportappserver.commlayer version 13.0.2000 is missing
我的IDE:MS VS 2010 Ultimate,CR V13.0.10
解决方案:
1.我为我的应用程序设置了x86,然后为我的安装应用程序设置了x64。
2.前提条件:我将支持的CR运行时文件CRRuntime_32bit_13_0_10.msi、CRRuntime_64bit_13_0_10.msi放置在以下目录中 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\Crystal Reports for .NET Framework 4.0
3.将合并模块文件包含到设置项目中。这里版本不是很重要,因为我使用的是13.0.10软件,13.0.16合并模块文件 我包含的文件:CRRuntime_13_0_16.msm 这个文件是在一组msm文件中找到的。
安装此合并模块将在以下目录中添加必要的DLL C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet
DLL文件版本不会引起任何问题。
在您的开发者机器上确认相同。

2
正如"M.A. Hanin"所述,这可能是由于InnerException引起的,就像这样:
"Unrecognized configuration section userSettings. (C:\Users\Pourakbar.h\AppData\Local\Accounting\Accounting.vshost.exe_Url_a4h1gnabohiu4wgiejk0d21rc2kbwr4g\1.0.0.0\user.config line 3)"

我删除了文件夹:C:\Users\Pourakbar.h\AppData\Local\Accounting\Accounting.vshost.exe_Url_a4h1gnabohiu4wgiejk0d21rc2kbwr4g,这对我有用!

(说明:此内容涉及技术问题,建议在操作时谨慎处理)


单元测试未被识别:C:\Users\YourUserName\AppData\Local\Microsoft.TestHost.x86\TestSourceHost__Enumering_StrongName_m5l5weancdfp4s54niytdpqgfzeu55uc\15.5.1\user.config - davidterra

1
- 最准确的Crystal Report版本 - 应该安装在计算机上的Crystal Report应用程序
1. SAP Crystal Reports For SAP Bussines One 14.2.8.3426 2. .NET Framework (64位)的SAP Crystal Reports运行时引擎 13.0.31.4010 || 13.0.31.3810 3. Microsoft Visual Studio版本的SAP Crystal Reports 13.0.31.4010 || 13.0.31.3810 所有问题都将在下载这些应用程序后得到解决...

1

这是一个老问题,但我通过搜索找到了答案。安装顺序很重要。我先卸载了CR Runtime和我的Windows Forms应用程序。先安装Windows Forms应用程序,然后重新安装CR Runtime。问题解决了。你的结果可能有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接