22

ロードされたローカル(binフォルダー内)アセンブリのリストを取得する必要がある次のメソッドがあります。

static IEnumerable<Assembly> GetLocalAssemblies()
    {
        Assembly callingAssembly = Assembly.GetCallingAssembly();
        string path = new Uri(Path.GetDirectoryName(callingAssembly.CodeBase)).AbsolutePath;

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        return assemblies.Where(x => !x.IsDynamic && new Uri(x.CodeBase).AbsolutePath.Contains(path)).ToList();
    }  

しかし、アセンブリのリストには、必要なアセンブリがいくつかありません。必要なアセンブリは管理され(c#.net 4)、プロジェクトで参照され、binフォルダーにあります。

アプリケーションの起動時に、binフォルダーに存在するバイナリがAppDomainにスイープされないのはなぜですか?

4

3 に答える 3

41

アディルはそれを持っていますが、より詳細には:

.NET CLRは、ジャストインタイムコンパイルを使用します。特に、これは最初の使用時にアセンブリをロードすることを意味します。そのため、使用中のアセンブリによって参照されているアセンブリにもかかわらず、プログラムを実行するためにCLRが参照をまだ必要としていない場合、それらは読み込まれないため、現在のAppDomainのアセンブリのリストに表示されません。

適用される場合とされない場合があるもう1つのことは、GACに同じバージョンのアセンブリがある場合、それらのアセンブリへのパスがDEVPATH環境変数で指定されていない限り、CLRはローカルアセンブリよりもGACを優先的に使用することです。これが当てはまり、CLRが「欠落している」アセンブリのいずれかのGACコピーを使用している場合、それらは異なるCodeBase値を持ち、Linqクエリ結果に表示されません。

もう1つ、CodeBaseプロパティの代わりにLocationプロパティの使用を検討することをお勧めします。Locationプロパティには、実行時にロードされたアセンブリへの絶対パスが含まれています。CodeBaseプロパティはわずかに異なり、プロジェクトのフルビルドのすべてのアセンブリで同じではない場合があります。

于 2012-04-23T17:04:17.823 に答える
11

CurrentDomain.GetAssemblies()は、実行フォルダーで使用可能なすべてのアセンブリではなく、ロードされたアセンブリのみを返します。

これは、Microsoftが「アプリケーションドメインにロードされたすべてのアセンブリのリストを取得するためのGetAssembliesメソッド」について述べていることです。ここをクリック

于 2012-04-23T17:01:36.160 に答える
5

これらの欠落しているアセンブリでクラスを開始してから、コードを再実行してください。アセンブリは、そのアセンブリに関連するものへの最初の呼び出しでのみ必要なときにロードされます。

于 2012-04-23T17:02:30.200 に答える