check whether the crystal report runtime is exists 检查crystalreport运行时是否存在

1.

            Try
                Dim rptDoc As New CrystalDecisions.CrystalReports.Engine.ReportClass()
                Dim rptView As New CrystalDecisions.Windows.Forms.CrystalReportViewer()
            Catch ex As Exception
                If (System.IntPtr.Size = 8) Then
                    Dim ehp As BLL2.ExecutorHelper = New BLL2.ExecutorHelper()
                    Dim path As String = ehp.Download2UnZipRpt()
                    BLL2.ExecutorHelper.ExecuteAsAdmin(path)
                Else
                    ' leave the work for 32bit os to develop in the future
                End If

            End Try

2. more information 

when you initialize a ReportDocument on a system without a crystal report runtime, it will thrown an error:


************** Exception Text **************
System.TypeInitializationException: The type initializer for 'CrystalDecisions.CrystalReports.Engine.ReportDocument' threw an exception. ---> CrystalDecisions.CrystalReports.Engine.LoadSaveReportException: An error has occurred while attempting to load the Crystal Reports runtime. Either the Crystal Reports registry key permissions are insufficient, or the Crystal Reports runtime is not installed correctly. Please install the appropriate Crystal Reports redistributable (CRRedist*.msi) containing the correct version of the Crystal Reports runtime (x86, x64, or Itanium) required. Please go to http://www.businessobjects.com/support for more information.
at CrystalDecisions.CrystalReports.Engine.ReportDocument.CheckForCrystalReportsRuntime()
at CrystalDecisions.CrystalReports.Engine.ReportDocument..cctor()
--- End of inner exception stack trace ---
at CrystalDecisions.CrystalReports.Engine.ReportDocument..ctor()
at GermanSchool.InvoiceReportForm.InvoiceReportForm_Load(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

// CrystalDecisions.CrystalReports.Engine.ReportDocument
private static void CheckForCrystalReportsRuntime()
{
    string pathList = Registry.LocalMachine + "\" + ReportDocument.CR_REGKEY;
    RegistryPermission registryPermission = new RegistryPermission(RegistryPermissionAccess.Read, pathList);
    registryPermission.Assert();
    RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(ReportDocument.CR_REGKEY);
    if (registryKey == null)
    {
        string @string = CREngineRes.GetString("IDS_ERROR_CR_RUNTIME_NOT_INSTALLED");
        ReportDocument.LogSCRException(@string, 4096);
        if (SystemInformation.UserInteractive)
        {
            MessageBox.Show(@string, CREngineRes.GetString("IDS_EVENTLOG_SOURCE"));
        }
        throw new LoadSaveReportException(@string, EngineExceptionErrorID.LoadingReportFailed);
    }
}
原文地址:https://www.cnblogs.com/zyip/p/3686016.html