2013年3月10日日曜日

Visual Studio 2010のVisualStudioインストーラーでCrystal Reportsのlog4net.dll関連エラーのためインストーラーが作成できない


クリレポ 2017.8 最新記事あり → https://oyaji-pgm.blogspot.jp/2017/08/20178-visual-studio-2017-2015-2013-2012_13.html


引き続きCrystal ReportsをVS2008→VS2010化しているのですが、これは業務システムが複数あるため。
VS2010化している理由はSQL SERVER 2012化対応することで問題発生するVisualStudioと.NetFrameworkとクリスタルレポートを使った業務システム の問題があるから。
今後の事を考え、クエリ作成でウィザードを使いたいが故、一つずつクリレポをVS2010化しており(ついでに.net4化)、デバッグ実行ではこれまでの記事の対策で、特にどれも問題なくレポートが出力されます。




しかし今度はセットアップを作成する所で引っかかってしまい、使用しているセットアップはVS2012で削除されたVisualStudioインストーラー。
あるシステムでは問題なくセットアップファイルは作成でき、しかし別のシステムではlog4net絡みのコンパイルエラーが発生しセットアップファイルが作成できない。


原因はlog4net.dllとエラーが出ます。 もういい加減ウンザリですよ、クリレポとlog4net。


エラー: ファイル 'log4net.dll' は 'AMD64' を対象にしていて、プロジェクトのターゲット プラットフォーム 'x86' との互換性はありません。
警告: ファイル 'log4net.dll' は 'x64' を対象にしていて、プロジェクトのターゲット プラットフォーム 'x86' との互換性はありません。



-------------------------------------
 セットアッププロジェクトで、コンパイルOK、コンパイルNG、となるプロジェクトの差異
-------------------------------------

① セットアッププロジェクトのTargetPlatform
 どちらもx86

② コンパイルが普通に通るセットアッププロジェクト、エラーとなるセットアッププロジェクト、log4netの差異(log4netは「見つかった依存関係」にある)
 コンパイルOKプロジェクト)SoucePath C:\Windows\assembly\GAC_32\log4net\1.2.10.0・・・・
 コンパイルNGプロジェクト)SoucePath C:\Windows\assembly\GAC_64\log4net\1.2.10.0・・・・



③ システムにインストールされている2つのlog4net.dll情報(C:\Windows\assembly)
 1.プロセッサのアーキテクチャー:x86、version:1.2.10.0
 2.プロセッサのアーキテクチャー:AMD64、version:1.2.10.0

上記を見れば、確かにエラーには納得。
②のOKプロジェクトはGAC_32、NGプロジェクトはGAC_64
NGプロジェクトはどうやら③-1を見ていないよう。ターゲットプラットホームはx86なので、そりゃエラーになるわな・・・と言う事は分かりました。


しかし問題は②
何故に「見つかった依存関係」に出現するlog4net.dllに違いが発生するのか?この原因が全く不明で、これ以上調べてもラチがあかないので、よくある無理やり的対処をすることにしました。


log4netを除外します。これでコンパイルを行うとエラー回避出来ます。当然log4net.dllは除外したのでパッケージングされません。
また別途ワーニングが出ますが無視。Framework.2.0でも古すぎて嫌なのに、MDAC2.8などWindows7時代にそんなもの使いませんよ。(クリレポ内部では使っているのかも知れないが?いい加減腹が立ってきたので無視 = 無視して動いて問題出ないなら本番環境でも無視します、私は)
後程出てきますが、無視してインストール実行できたので、依存関係にあるクダランDLLが使っているのでは?だったら無視。.net2.0やmdacなんてインストールしたくないですから。

 警告: 選択した 'SAP Crystal Reports Runtime Engine for .NET Framework' 項目には 'Microsoft.Net.Framework.2.0' が必要です。[必須コンポーネント] ダイアログ ボックスで足りない必須コンポーネントを選択するか、または足りない必須コンポーネントのブートストラップ パッケージを作成してください。
 警告: 選択した 'SAP Crystal Reports Runtime Engine for .NET Framework' 項目には 'Microsoft.Data.Access.Components.2.8' が必要です。[必須コンポーネント] ダイアログ ボックスで足りない必須コンポーネントを選択するか、または足りない必須コンポーネントのブートストラップ パッケージを作成してください。



エラー回避できたことでインストーラーが出来ました。警告は無視したので.net2.0もmdac2.8もパッケージングされません。これをHyper-Vで構築した真っ新なWindows7へインストール。

インストーラーでは.NetFramework4とSAP CrystalReportsRuntimeEngin for .NetFrameworkを必須コンポーネントとしているので、DLとインストールが始まります。


こちらの思惑通り、最新の13.0.5ランタイムがDLインストールされたようです。

こちらは.net、参考までに

真っ新なWindows7に下記インストールされました



これで業務システムを起動し、CrystalReportViewerへレポートを作成表示させてみます。すると問題なくレポートが出力され、印刷も、エクスポートも問題なく完了しました。


log4net=クリレポがログ出力しなければならない事態になった時、現状では何らかの問題が生じるかもしれませんが、業務プログラム作成者側はそんな情報を必要としません。

よってこれでクリレポVS2010化は全て終了としますが、ホント嫌になりました、SAPのクリレポ。疲れ果てました。。





◆◆◆◆◆◆ 再度注意!◆◆◆◆◆◆

前にも書いた.NetFramework4.0以降でCrystalReportを使う時の必須指定。これを忘れると必ずエラーが出ると覚えておいた方が良いです。これはVS2012対応のSupport Pack 5(v. 13.0.5.x)を使用しても改善しません。私は早々に忘れ、また嵌りましたメ

何故なら.NetFramework4や4.5のみインストールされた環境では.NetFramework 2.0 向けにビルドされたアプリケーションを実行出来ない(エラーとなる)ためで、これは上記ワーニングにもあったよう最新のSP5CrystalReportも、.NetFramework 2.0向けに作られているのだと推測できます。


  DataTable tb = ・・・・
  CrystalReport1 cr1 = new CrystalReport1();
  cr1.SetDataSource(tb); ←ここでエラー発生する

CrystalDecisions.CrystalReports.Engine.Engine.DataSourceException
不明なクエリー エンジン エラー ファイル C:\\Users\\xxxx\\AppData\\Local\\Temp\\temp_....{....}.rpt のエラー :不明なクエリー エンジン エラー。"}
errorID:CrystalDecisions.CrystalReports.Engine.EngineExceptionErrorID.DataSourceError



<< 対策 >>
app.configのstartup属性に必ずuseLegacyV2RuntimeActivationPolicy="true"を指定する


<startup useLegacyV2RuntimeActivationPolicy="true">


useLegacyV2RuntimeActivationPolicyとは、.NET Framework 2.0 のランタイムのアクティブ化ポリシーを有効にする
http://msdn.microsoft.com/ja-jp/library/vstudio/bbx34a2h(v=vs.110).aspx


とにかく.net4や.net4.5でクリレポを使う場合は、必ずapp.config の startup 属性にuseLegacyV2RuntimeActivationPolicy="true"をつけておけば間違いない、と言う話です。

◆◆◆◆◆◆ 再度注意!◆◆◆◆◆◆









余談ですが・・

これまでSystem.Transactionsを使って複数データ出力する場合、2つ目のoutputでトランザクションが昇格してしまい分散トランザクション扱いになるため、これまでPC側でMSDTCの設定が必要でした。(DTCサービスを起動させておくのとは別に、ネットワークDTCアクセス:PCのコンポーネントサービス.ローカルDTC.セキュリティータブを設定する事)

@ITでは分散トランザクションに昇格させないための工夫など記事になっていましたが。
http://www.atmarkit.co.jp/ait/articles/0804/25/news169_4.html
・・この記事を見る限り、ネットワークDTCアクセス設定をせず問題なくトランザクションが正常終了すると書いてありますが?実際はXPでは上手くいかなかったぞ・・

しかし・・・Windows7では特にネットワークDTCアクセスを設定せず分散トランザクションを走らせてみても正常終了します。当然DTCサービスは動いていますが。

なんででしょう?仕様が変わった?分散トランザクション扱いでなくなった?

調べてないのでよく分かりませんが、楽になったのならそれはそれで良いのですが、不思議?と言うだけの話でした。。









1 件のコメント:

  1. もういい加減ウンザリですよ、クリレポとlog4net←めっちゃわかる

    返信削除