1

アセンブリ A に次のクラスがあります。アセンブリには StructureMap 2.6.1 への参照があります。

public static class Bootstrapper
{
    public static void Bootstrap(string databaseName)
    {
        StructureMapBootstrapper.Bootstrap(databaseName);
    }
}

まったく別のアセンブリ (B) でアセンブリ A を参照しています。この行が呼び出されると、次のランタイム エラーが発生します。

Bootstrapper.Bootstrap(db);

実行時エラーは次のとおりです。

FileNotFoundException: ファイルまたはアセンブリ 'StructureMap、Version=2.6.1.0、Culture=neutral、PublicKeyToken=e60ad81abae3c223' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

StructureMap.dll をアセンブリ B の bin ディレクトリに常にコピーする必要があります。これは非常に面倒です。これを解決する方法について何か提案はありますか? AssemblyA によって参照されるアセンブリが AssemblyB によって必要とされる時期に関する一般的なルールを知っている人はいますか?

ありがとう!


素早い返信ありがとうございます。StructureMap を参照として単純に追加することを考えました。しかし、私が設計で目指していた角度は、基盤となる実装を消費者から切り離すことでした。つまり、アセンブリ B は、StructureMap が最終的に使用されているという事実を認識しません。また、GAC StructureMap を使用すると、展開の問題が発生しますよね? グローバル キャッシュに StructureMap を持たないホスト マシンにサイトをデプロイすると、振り出しに戻ります。このアセンブリ参照の問題を考えると、真の抽象化がどのように実現されるのか興味があります。

4

4 に答える 4

2

依存関係を検査して修正するために使用できるRefixという優れたツールがあります。

于 2010-06-22T16:26:28.173 に答える
1

DLL のコピーを回避するには、StructureMap.dll をプロジェクトに追加し、AssemblyA のビルド時に VS がそれを出力に自動的にコピーするようにします。

または、ILMerge を使用して StructureMap.dll をアセンブリ B にマージすることもできます。アセンブリ B には必要なすべての IL が含まれているため、コピーについて心配する必要はありません。

または、StructureMap.dll をグローバル アセンブリ キャッシュに追加することもできます。これにより、.NET はコピーしなくてもそれを見つけることができます。ただし、IIRC、すべての GAC アセンブリには厳密な名前が必要です。

于 2010-06-20T04:40:41.273 に答える
0

余談ですが、アセンブリには厳密な名前が付いているため ( の値があることからわかりますPublicKeyToken)、StructureMap アセンブリをGACにインストールできます。システム。これで問題が解決する可能性があります。

アセンブリを GAC に配置する場合は、配置方法によって異なります。これは Winforms アプリケーションであると想定しているため、セットアップ プロジェクトを通じてデプロイすることも想定しています。その場合、GAC に入れるはずのアセンブリをプロジェクトに含めるのは簡単で、存在しない場合はそこにインストールされます。

あなたの質問に答えるために、アセンブリのバインドと読み込みは多少微妙ですが、一般的なルールは、含む型が最初に読み込まれるときにアセンブリが読み込まれるということです。参照するコードのブロックがアクティブなスタック フレームにあるとすぐに、型が読み込まれます。

最後の文は、本質的に次のように要約されます。次のいずれかが発生したときに型がロードされます。

  • 問題の型をインスタンスまたは静的変数として使用する別の型が読み込まれます

たとえばA、 、B、およびの型があるとしCます。

public class A
{

}

public class C
{

}

public class B
{
    private A myA;
    private static C myC;
}

BがロードAされると、インスタンス変数として使用されるCためロードされ、静的変数として使用されるためロードされます。

  • 問題の型をローカル変数、パラメーターとして使用する関数、またはそれをパラメーターとして使用する別の関数を呼び出す関数。
于 2010-06-20T04:40:51.523 に答える
0

アセンブリ B に StructureMap への依存関係を認識させずに、ファイルを毎回手動でコピーすることを避けたい場合は、StructureMap をアセンブリ A への参照として追加し (他の人が言っているように)、両方のプロジェクトのビルド出力パスを同じディレクトリに設定できます。 ([プロジェクト プロパティ] -> [ビルド] タブ経由)。このようにして、アセンブリ A もそれを「見る」ことができます。

于 2011-10-14T05:52:37.053 に答える