Crystal Reports XIをドットネットに使用すると、非常に奇妙な例外が発生します。私は現在、エンタープライズアプリケーション用のVB.Netでレポートサービスを開発しています。このサービスは、System.AddIn (aka Managed Add-in Framework or MAF)を使用してプラグイン/アドインとしてメインアプリケーションでホストされています。メインアプリケーションはWinフォームを使用し、WPFElementHostのアドインによって提供されるコントロールをホストします。Crystal Reportのレポートソースを設定すると、crdb_adoplus.dllにNullReferenceExceptionがスローされます
アドインは独自のアプリケーションドメイン内にあり、アドインアプリケーションドメインからNativeHandleContractsを使用してWPFコントロールを実行時にWPFElementHostにバインドされているホストアプリケーションドメインに渡します。
アドインで提供されるWPFコントロールには、Crystal Report Viewerコントロールが含まれています。これまでは、すべて正常に動作します。私はアドインでほぼすべてのWPFコントロールを作成することができ、ホストアプリケーションで完璧に動作します。ビューアにレポートを添付しようとするとすぐに、これは分断されます。
まず、ADO.Net DataSetをデータスキーマとして使用して、レポートを作成しようとしました。これがレポートビューアに読み込まれるたびに、クリスタルレポートはスキーマが存在しないという例外をスローします。これは何らかの理由でCrystal Reportsがホストアプリケーションのアプリケーションドメインとスキーマの名前空間を調べたいからです。ただし、スキーマは完全に異なるアプリドメインと名前空間に存在します。スキーマをリソースとして埋め込み、ローカルにコピーしようとしました。成功しなかった私は.Netオブジェクトを使用するようになりました。
.Netオブジェクトを使用して、レポート用に設計されたXMLドキュメントを作成しました。これは正常に動作し、レポートを渡してホストアプリケーションで表示することができました。これは私が現時点で詰まっているところです。 レポートのデータソースを提供しようとするたびに、Crystal Reportsはnullの参照例外をSAPのDLLであるcrdb_adoplus.dllにスローし、例外の原因を知らせません。すべてのオブジェクトが適切にインスタンス化され、レポート、ビューア、wpf要素ホスト、およびwpfコントロールが作成されます。エンティティフレームワークを使用して提供される私のデータセットは、データセットに変換されているので、null可能な型はなく、dbnull値のみです。この時点でこの例外がスローされる必要はありません。スローされる例外以外の追加出力は提供されません。
さらに、作成されたレポートオブジェクトには、この読み込みプロセス中にタイムアウトする部分があります。これは、あらゆる種類の例外やエラーがスローされることなく行われます。
データを取得し、データをレポートにバインドし、レポートをビューアにバインドしようとしているコードを次に示します。
Try
Dim messages As String = Nothing
If report Is Nothing Then
report = New BOMPartsListWithStandard
End If
Using conn = BOMReportingService.BOMReportingServiceClient.CreateConnection()
Dim dataSet As DataSet = conn.Proxy.GetBOMTreePartsListElements(5339, messages).ToDataSet
report.SetDataSource(dataSet)
End Using
reportViewer.ViewerCore.ReportSource = report
reportViewer.ViewerCore.RefreshReport()
Debug.WriteLine($"Created and attached report succesfully. With {IIf(String.IsNullOrEmpty(messages), "no messages.", messages)}")
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
report.SetDataSource(dataSet)
ビットは、例外がスローされる場所です。
私は何かを見落としていますか?正しいアプリドメインでADO.Net DataSetを使用するようにCrystal Reportsに納得させる方法はありますか?そうすれば、XMLの問題を解決できますか?
このアドインは、実行時に動的にアンロードして再ロードできるように、別のアプリケーションドメインまたはプロセスに存在する必要があります。これはシステムの要件です。また、自己完結型である必要があるため、アプリケーションのホスト側では何もできません。すべてがアドイン内で動作する必要があります。
ご協力いただきありがとうございます。
ToDataSetは、メモを追加したものと同様に、DataSetに変換してIListを設定する一般的なエクステンションです。これは問題なく動作し、Entity FrameworkのNullable型をDBNull.Valuesに変換する必要がありました。 –