3

私はこの質問がstackoverflowとウェブ全体で答えられているように見えることを知っていますが、私の問題は異なります。

次の設定がある場合、GACを使用しない方法(上司は「いいえ」と言います)を理解しようとしています。

プロジェクトはNHibernateとAntlr3.Stringtemplateを使用します。どちらもサードパーティのアセンブリです。NHibernateにはAntlr3.Runtimeバージョン3.1.3.42154への参照がありますAntlr3.StringtemplateにはAntlr3.Runtimeバージョン3.3.1.7705への参照があります

もう一方が利用できない場合、一方はエラーになります。

リダイレクトをバインドしようとしましたが、publicKeyTokenがバージョン間で異なるため、これは機能しません。最終的に、3.1.3.42154バージョンと一致する公開鍵トークンを持つ3.3.17705を探します。

GACに一方または両方をインストールすると機能します。ただし、上司はGACに何もインストールさせません。

また、バージョン3.1.3.42154のフォルダーを持つLibプロジェクトを含めることにより、両方のDLLをBINディレクトリに配置してみました。常にコピーするように指示したので、/ bin / Lib / 3.1.3.42154 / Antlr.Runtime.dllを取得します。次に、そのディレクトリをプローブするためのプローブ要素を追加しました。これは機能せず、まったく同じエラーが発生しました。

別のサードパーティアセンブリを参照するサードパーティアセンブリをどのように使用できますか?どちらも異なるバージョンを参照していますか?

アップデート:

    System.Reflection.Assembly.LoadFile(@"Antlr3.Runtime.dll"); // 3.3.1        
    System.Reflection.Assembly.LoadFile(@"Antlr3.Runtime\Antlr3.Runtime.dll"); // 3.1.3

AppDomain.CurrentDomain.GetAssemblies()は、バージョンがアプリドメインに読み込まれていることを示していますが、3.1.3が見つからないというエラーが表示されます。

以下は、エラーが発生したコードを呼び出す直前にAppDomain.CurrentDomain.GetAssemblies()からロードされたものです。最初の2行はGetAssemblies()の内容であり、3行目はエラーが欠落していることを示しています。

{Antlr3.Runtime, Version=3.3.1.7705, Culture=neutral, PublicKeyToken=eb42632606e9261f}
{Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7}
 Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7
4

1 に答える 1

1

問題を解決しました。

これは、Antlr3.StringTemplate の使用に特有の問題です。stringtemplate を作成した人は、元の antlr dll を配布する代わりに、実際に antlr のソースをダウンロードし、彼のアプリケーションでビルドしました。彼の新しい antlr dll は同じ名前ですが、署名が異なります。彼はバージョンとその公開鍵トークンを変更します。そのため、NHibernate などでオリジナルを使用しようとすると、非常に悪い競合が発生します。

そこで解決策は、ILMergeを使用して彼のカスタム Antlr3 DLL を string.template DLL にマージし、string.template dll がそれ自体に依存するようにすることでした。Antlr3.Runtime.dll、Antlr3.StringTemplate.dll、および Antlr3.Runtime.Debug.dll を単一の DLL Antlr3.StringTemplate.dll にマージしました。

これにより、すべての DLL 競合が解消され、nhibernate が必要とする Antlr3.Runtime.dll を含めることができました。stringtemplate を作成する人は、自分のパッケージもこの方法で配布する必要があります。

于 2011-07-06T22:08:38.140 に答える