2012-02-16 10 views
2

私はこのことに非常に新しいので、私の質問がうまく構成されていないか、間違った場所などで謝っています。私はこれに対する解決策を探していて、私は、Nhibernateを利用するソリューションを持っているので、log4net/2.0 /フォルダーに入っているlog4net V1.2.10.0を使用する必要があります。しかし、私のソリューションは、私が非常に限られたアクセスしか持たない他の多くのソリューションにもリンクしています。これらは同じlog4net V.1.2.10.0をフォルダ内で使用しています:log4net/1.2/Nhibernate log4netと既存のlog4netとの競合を止めるにはどうしたらいいですか?

解決策を実行すると、このエラーが発生します。

{"Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from HRESULT: 
0x80131040)":"log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=e27b8fa57f63a98d"} 

は、しかし私は、たびに私は、すぐにそれは別のソリューションを使用しようとして、その溶液中にエラーが出るものを修正し、それを呼び出しているソリューションを改正しようとしたので、私は別のを修正しなければならないので、に。修正するソリューションが多すぎるだけでなく、他のソリューションとの相互関係が多すぎるため、log4net/2.0を使用するためにそれらをすべて変更できるように私がコントロールすることは絶対にありません。

私は基本的に同じ問題だと思うもう1つの質問(Referencing 2 different versions of log4net in the same solution)を見つけましたが、app.configをバインディングで修正していますが、私はこの権利を得ることはできません。同じエラー。私はそれが「あなたは、各バージョンのプロジェクトの一つに2フォルダを作成すると言うときに、他の質問への答えは何を意味するのかわからないんだけど

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="log4net" publicKeyToken="e27b8fa57f63a98d" /> 
    <codeBase version="1.2.10.0" href="2.0\log4net.dll" /> 
    </dependentAssembly> 
    <dependentAssembly> 
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821"/> 
    <codeBase version="1.2.10.0" href="1.2\log4net.dll" /> 
    </dependentAssembly> 
</assemblyBinding> 
</runtime> 

:私は私のApp.configファイルに含まれてきた結合はこれですlog4net。各log4net.dllを対応するフォルダに配置します(追加参照ではなく)ソリューションにファイルを追加します。コピーする出力ディレクトリのプロパティを設定して、常にコピーして出力フォルダに自動的にコピーされますあなたが構築する。私のソリューションが参照するすべてのソリューションにこれを行う必要がありますか?

理想的には、ソリューションのいずれかが使用しているlog4netを気にしないが、お互いにログメッセージを引き渡すことができるという意味で、私のソリューションを改訂できるようにしたい。私はこれが可能であると仮定し、どんな助けも大いに評価されるでしょう。いずれか、またはどのようにしてnHibernateのロガーをオフにすれば、私が使っているlog4netが気にしないので、他のすべてのソリューションが使用しているlog4net/1.2を使い続けることができます。私はそれをオフにするすべての種類のものを試しましたが、それはまだlog4net/2.0を検索しようとしているようです。

+0

申し訳ありませんが、私はこの部分を含めていないことに気付きました。上記のバインディングを使用すると、ソリューションを実行しようとするとすぐにこのエラーが発生します。 '{"ファイルまたはアセンブリ 'log4net、Version = 1.2.10.0、Culture = neutral、PublicKeyToken = 1b44e1d426115821'またはその依存関係の1つをロードできませんでした。 ) ":" log4net、Version = 1.2.10.0、Culture = neutral、PublicKeyToken = 1b44e1d426115821 "}'バインディングを使用しないと別のソリューションを参照しようとするまで実行され、エラーが表示されます。 –

+2

あなたはどのバージョンのNHibernateを使用していますか? NHibernateは3.0.0以降、log4netの特定のバージョンを必要としません。 – cremor

+0

OSSプロジェクトを開始するときに "DLL hell"というバージョニングの問題が発生することは珍しくありません。しかしそれに固執する価値がある –

答えて

1

あなたは同じDLLを2つの場所に持っているという点で幸運です。問題が解決しやすくなります。バックアップを取ってDLLの参照(\ 1.2 \ version?)の1つを削除してから、ソリューション内の壊れた参照を解決すれば、コンパイルできるポイントに達するはずです。

NuGetも試しましたか? Log4Netへの参照を追加し、Nhibernateへの参照を追加することができます.Nhibernateへの参照を追加すると、すでに依存関係の要件を満たしており、NHibernateへの別の参照をダウンロードする必要はありません。

NuGetを使用することの習得のカーブをお勧めします。長期的に見れば、あなたの人生をはるかに簡単にする強力なツールです。

更新 現在のフォルダ構造を提供することについてのコメントを参照してください。次のようにすれば開始するはずです。

直接ファイル参照を使用してこれを試してみるには、DLLをより良い構造に移動する必要があるかもしれません。あなたのソリューション(プロジェクトではない)の中で、ソリューション項目の下に次のフォルダ構造を作成します。

\ EXTERNALREFERENCES \ log4netの \ NHibernateは\

移動単一のログ4のネットフォルダ内にlog4netのDLLのコピー(および削除他のインスタンス)、その後、移動\すべてのNHibernateのDLLの使用しています(マイナスLog4Net)をNHibernateディレクトリに保存します。 app.config内のバインディングを削除し、各プロジェクトを参照して、外部参照内のバージョンを参照するように参照を更新します。

ファイルの実際の場所はあまり重要ではありません。DLLの単一のインスタンスを参照するコードが必要です。ビルドすると、すべてがバインドフォルダにコピーされます。あなたは2つのインスタンスを持っているので問題にぶち当たっています - コードを編集している間など.Hibernateは実際Log4Netがあるところではあまり気にしません。それが実行されたときに必ず実行される必要がある依存関係があります。

アップデート2

の後方互換性を壊しNuGet上Log4Netの新バージョン - 詳細は、参照のブログ記事を参照してください。 1.2.10.0とは異なる強力な名前を含むLog4Netのバージョン1.2.11.0がリリースされました。

+0

私は本当にあなたの最初の段落を理解していない。私は2.0の "バージョン"を私のソリューションで参照しているので(nHibernateが動作するように)、1.2の "バージョン"は他のすべてのソリューションで参照されています。それらのすべてに。 NuGetも見ていきますが、最初の段落について説明できますか? –

+0

これらの問題を解決するように設計されているので、NuGetアプローチを推奨します。ただし、直接参照のみを使用して問題を解決するには、プロジェクト内にDLL参照を含めていることを確認してください。 –

関連する問題