2011-12-15 9 views
10

私のプロジェクトの一部であるいくつかのクラスライブラリを使用するプロジェクトがあります。最初にAssemblyAがロードされ、次にAssemblyBがロードされます。現在のドメインにアセンブリロードを強制する正しい方法

var x = typeof(AssemblyB.AssemblyB_Type); 
:AssemblyAでAssemblyAは、そのためのアセンブリをロードするために、AssemblyBがCurrentDomainにまだロードされていない、ことを行おうとするときは、次の

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
var assemblyB = assemblies 
       .Where(x=>x.GetName() == "AssemblyB") 
       .First(); 
var type = assemblyB.GetType("AssemblyB_Type"); 

は、残念ながら私は、次の不必要なことをやってるんコードがあります

コンパイラは、私はそれ以外の場合は動作しませんということを説明する言葉を見つけることができませんけれども、このラインは、必要とされていないことを警告表示されるので、質問は次のようになり、どのように正しく(風水的に)アセンブリを強制します余分な役に立たない配管をせずにCurrentDomainにロード

+1

だけAssembly.Load()を使用します。または、CLRにアセンブリを自動的にロードさせるには、var type = typeof(NamespaceNameInAssemblyB.AssemblyB_Type)を使用します。 –

+0

私は少し混乱していると思います。 typeof(AssemblyB.AssemblyB_Type)を実行できるのであれば、なぜassemblyB.GetType( "AssemblyB_Type")を実行する必要がありますか? –

+1

サードパーティのJIntライブラリ(JavaScriptインタープリタ)があります。 JavaScriptソース内からCLR型をバインドすることができます。まず、それは(AppDomain.CurrentDomain.GetAssembliesを使用しています)し、それは私のアセンブリがC#のコードに触れていなかった場合、それはCurrentDomainにロードされていないとJavaScriptからアクセスすることはできませんされ、そのアセンブリ内の適切なタイプを検索しようと... – Lu4

答えて

8

あなたの既存のコードがこれを行う最善の方法です(AFAIK)。

が警告を取り除くために、あなたの参照されるアセンブリが正しく配置されている場合は、そのタイプのいずれかを呼び出した場合、彼らは「ただロ​​ード」する必要があり

typeof(AssemblyB.AssemblyB_Type).ToString(); 
+0

それは残念だ:(ひどい見えます... – Lu4

3

に変更します。 .NETフレームワークでこれを処理する必要があります。

はここにあなたの参照されるアセンブリのためのフレームワークを検索する方法を説明する良い記事です:http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

私はあなたが途中でこのようにアセンブリをロードする必要があることをやっていること興味?絶対に必要な場合を除き、私はこれを阻止するだろうけれども -

あなたの直接的な質問に答えるためのハックは、Assembly.Load(文字列の場所)を使用することです。 http://msdn.microsoft.com/en-us/library/ky3942xh.aspx

+0

サードパーティJINTライブラリ(JavaScriptのinterpriter)があります。それは、JavaScriptソース内からCLR型を結合できます。まず、それは 'AppDomain.CurrentDomain.GetAssembliesを()'使用していますし、それを見つけようとしますそのアセンブリの適切な型、私のアセンブリがC#コードで触れられていない場合、それはCurrentDomainにロードされず、JavaScriptからアクセスできません... – Lu4

+0

Gotcha。何も私の頭をatmからジャンプしません - これを修正する素晴らしい動的方法AppDomain.CurrentDomain.GetAssemblies()を列挙し、それらが参照しているすべてのアセンブリを読み込むことになります。これはメモリとスタートアップのパフォーマンスの問題を引き起こす可能性がありますが、 eferencedAssemblies() "http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies。aspx – Dlongnecker

+0

何かがここで奇妙な感じが、私は良い解決策があると思うが、それはJIntへの変更を含む可能性があります.... – Dlongnecker

1

だから、あなただけのアプリケーションドメインにあなたのbinディレクトリにあるすべてのアセンブリを読み込むことができます。これはあなたの問題を解決するはずです。

var assemblies = Directory.GetFiles(containingDirectory, "*.dll")' 

foreach (var assembly in assemblies) 
{ 
    Assembly.Load(AssemblyName.GetAssemblyName(assembly)); 
} 
+0

これは、どこから実行されているかを前提にしている場合にのみ機能します。たとえば、コードがIISや単体テストランナーなどの別のホストで実行されている場合は機能しません。 – nathanchere

1

は、これは私が何をすべきかです:あなたはその後、オンデマンドでのアセンブリをロードする場合

public static class TypeExtensions { 
    public static void EnsureAssemblyLoads(this Type pType) { 
     // do nothing 
    } 
} 

... 

typeof(SomeType).EnsureAssemblyLoads(); 
関連する問題