これはヘッドスクラッチャーです。これが取引です。
Delphi 2007 for .NET でビルドされた ASP.NET アプリケーションのベータ コピーをテスト サーバーにデプロイしているときに、奇妙な問題に遭遇しました。使用していた ADO.NET データ プロバイダーの正しいバージョンを読み込めなかったため、アプリケーションを起動できませんでした。
古いアセンブリのバージョンを bin ディレクトリに含めることによってのみ、アプリケーションが実行されます。ただし、この古い .NET データ プロバイダーに縛られたくないので、この問題の解決策を見つけようと決心しています。
最初に、.net データ プロバイダ アセンブリをローカル コピーとして使用してプロジェクトをコンパイルしました。これにより、Delphi は、プロジェクト マネージャの参照フォルダに追加したときに選択したバージョンのアセンブリのコピーを使用する必要がありました。私が選択した実際のアセンブリはバージョン 9.10.2.0 で、アプリケーションと共に bin ディレクトリに表示されるアセンブリのバージョンです。ただし、実行時に、アプリケーションは同じアセンブリの以前のバージョンである 9.0.2.7 にバインドしようとしていました。
(実際には、この問題は GAC バージョンの Copy Local を使用しているかどうかに関係なく発生するため、問題ではないと思います。)
この問題を調査しているときに、新しいプロジェクトを作成し、9.10.2.0 アセンブリへの参照を追加しました。それでも、.NET 2.0 構成ユーティリティと Reflector の両方が、アプリケーションが 9.0.2.7 アセンブリへの参照を使用してコンパイルされたことを示しました。
GAC を調べると、9.0.2.7 と 9.10.2.0 の両方のバージョンが登録されていることがわかりました。9.0.2.7 バージョンを削除しようとすると失敗します。これは、そのバージョンのプロバイダーがまだ GAC 内のアセンブリを参照していたためです。
レジストリにアクセスし、9.0.2.7 プロバイダーへのすべての参照を手動で削除しました。その後、GACから削除できました。これは何も変わりませんでした。既存のアプリケーションからアセンブリを削除し、9.10.2.0 バージョンを追加してコンパイルすると、間違ったアセンブリ情報がアプリケーションに挿入されました。以前と同様に、9.0.2.7 への参照がまだ実行可能ファイルに挿入されていたため、9.10.2.0 アセンブリを参照する新しいアプリケーションを作成しても機能しませんでした。
Delphi ライブラリの検索パスを確認しました。また、古いアセンブリ ファイルのすべてのインスタンスをマシンから完全に削除しました (ASP.NET 一時ファイル ディレクトリからも削除しました)。私はまだ問題を抱えています。Issam Ali の AppManifest ユーティリティを使用してマニフェストを手動で調整しようとしましたが、Delphi 2007 for .NET では ASP.NET アプリケーションをサポートしていないようです。
そのため、GAC には 9.0.2.7 への参照が含まれなくなり、レジストリにそれへの参照がなくなり、プロジェクトまたは Delphi オプション ダイアログに古いプロバイダ ディレクトリへのパスがなくなり、古いプロバイダ アセンブリがファイル システムになくなります。 、および 9.0.2.7 はどのプロジェクト ファイルにも表示されません。また、web.config、machine.config、またはチェックした他のファイルにも表示されません。それにもかかわらず、9.10.2.0 バージョンのアセンブリを参照するときはいつでも、Delphi はこのバージョンのアセンブリを使用することを主張します。(はい、Delphi を再起動し、この開発を行っていた仮想マシンも再起動しました。)
9.10.2.0 データ プロバイダー (古いものは既にアンインストールされています) をアンインストールして再インストールした後でも、データ プロバイダーの参照をアプリケーションに追加すると、ランタイム アプリケーションが古いプロバイダーを読み込もうとします (古いプロバイダーへの参照がない場合でも)。明らかにシステムに残っています)。
他の解決策 (ここで言及する価値があります) を試しましたが、どれもうまくいきませんでした。誰かこれを見た?私はこの問題に引き続き取り組みますが、提案を聞きたいです。Delphi が古いアセンブリ情報をプロジェクトに挿入するのをやめさせることができません。
笑顔のために、失敗からのエラーログを含めています。このログは基本的に、フュージョン ログから取得した情報を複製したものです。このログは、GAC から 9.0.2.7 アセンブリを削除した後に作成した単純なアプリの 1 つからのものです。最初から古いバージョンのプロバイダーを探していることに注意してください。
アセンブリ マネージャーの読み込み元: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 実行可能ファイル c:\windows\microsoft.net\framework\v2.0.50727\aspnet_wp.exe で実行 --- 詳細なエラーログが続きます。
=== バインド前の状態情報 === LOG: User = TRAINING8A\ASPNET LOG: DisplayName = Advantage.Data.Provider, Version=9.0.2.7, Culture=neutral, PublicKeyToken=e33137c86a38dc06 (完全指定) LOG: Appbase = file:///C:/Inetpub/wwwroot/TestAdsVer2/ LOG: Initial PrivatePath = C:\Inetpub\wwwroot\TestAdsVer2\bin
アセンブリの呼び出し: TestAdsVer2、バージョン = 1.0.3572.17384、カルチャ = ニュートラル、PublicKeyToken = null。
ログ: このバインドはデフォルトのロード コンテキストで開始されます。ログ: アプリケーション構成ファイルの使用: C:\Inetpub\wwwroot\TestAdsVer2\web.config ログ: ホスト構成ファイルの使用: c:\windows\microsoft.net\framework\v2.0.50727\aspnet.config ログ: マシン構成ファイルの使用c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config から。ログ: ポリシー後の参照: Advantage.Data.Provider、Version=9.0.2.7、Culture=neutral、PublicKeyToken=e33137c86a38dc06 ログ: 新しい URL ファイルのダウンロードを試行しています:///c:/WINDOWS/Microsoft.NET/Framework/v2 .0.50727/一時 ASP.NET ファイル/testadsver2/07545aea/3d068a5/Advantage.Data.Provider.DLL. ログ: 新しい URL ファイルのダウンロードを試みています:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/testadsver2/07545aea/3d068a5/Advantage.Data.Provider/Advantage.Data.Provider .DLL. ログ:新しい URL ファイルのダウンロードを試みています:///C:/Inetpub/wwwroot/TestAdsVer2/bin/Advantage.Data.Provider.DLL。WRN: アセンブリ名を比較すると、不一致が発生しました: マイナー バージョン ERR: アセンブリのセットアップを完了できませんでした (hr = 0x80131040)。調査終了
これはあまりにも長く続いたため、LanceSC の回答に追加したコメントが表示されなくなりました。しかし、これは私が対処したい興味深いアイテムです。
LanceSC への最後の 2 つのコメントは次のとおりです。
この動作を示したインストールは、機能しなくなった VM にあります。私が知っている別の開発者も、これと同じ問題を経験しました。解決策は、インストールを放棄することでした。この .NET データ プロバイダーの特定のバージョンのインストーラーに、問題を引き起こした奇妙なアーティファクトが残っているように感じます。このデータ プロバイダーの他のビルドでは発生しません。私はもはやこの質問に対する答えを求めていません。
話すのが早すぎた。私の同僚は、今日 (2010 年 3 月 5 日)、同じ .NET データ プロバイダーの少し前のバージョン (9.0.2.1) で同じエラーに遭遇しました。彼は今、私と同じ立場にいます。どのバージョンのデータ プロバイダーでもアプリケーションを実行することはできません。古いものを保存してください。そのアセンブリはローカル コピーとして使用されており、古いバージョンは gac にありません。彼のマシンを使用して、verbose オプションを指定して MSBuild を実行しました。ビルドはエラーなく正常に動作しました。それにもかかわらず、古いバージョンのプロバイダーが見つからなかったため、コンパイル アプリケーションは実行できませんでした。
概要
私の同僚は辞任して Delphi 2007 を再インストールしました (幸いなことに、彼は VM で作業していて、Delphi 2007 を使用する 2 つ目の VM を持っていましたが、問題の .NET データ プロバイダーは一度もインストールされていませんでした。これも私の戦術でした。
この時点で、この問題は解決できないという結論に達しました。それにもかかわらず、私はこの質問をもう 1 週間ほど開いたままにしておきます。今後数週間で実行可能な解決策が提案されない場合は、この質問を閉じます.
それまでの間、私は同僚に、提案された解決策や調査をテストするために、問題のあるプロバイダーで VM を保存するように依頼しました。