2011-02-07 19 views
8

私はActivatorを使用して、アセンブリの短い名前(e.a.'CustomModule ')に基づいて新しいクラスをインスタンス化しています。アセンブリが存在しないため、FileNotFoundExceptionがスローされます。 特定のアセンブリ名が存在するかどうかを確認する方法はありますか?特定のアセンブリが存在するかどうかを確認する方法は?

私は次のコードを使用しています:

System.Runtime.Remoting.ObjectHandle obj = 
    System.Activator.CreateInstance(assemblyName, className); 

を主な目的は、例外が発生するのを待つのではなく、アセンブリの存在をテストすることです。

+0

現在のアプリドメインにロードされていますか? 'assemblyName'とは何ですか?完全修飾アセンブリ名または物理ファイルパス? –

+0

@MrDisaapointment私が知っている唯一のことは、私のデータベースに「CustomModule」があることです。 CustomModule.dllがbinまたはGAC(!?)に存在する場合、classnameで指定されたクラスが生成されます。 –

+0

私の最新のアップデートを見て、うまくいけば、これは続行するのに十分です。 –

答えて

8

、あなたの質問に私のコメントを気づく場合、私がまさにあなたがしたいか、これについては移動する必要があるか当然わからないんだけど、私たちは、より精巧な説明を持ってまで、私が唯一提供できることは明らかですあなたはそれがあなたの状況によく合う期待して(キーは「検索」アセンブリである)この:

var className = "System.Boolean"; 
var assemblyName = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; 
var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
var assembly = (from a in assemblies 
       where a.FullName == assemblyName 
       select a).SingleOrDefault(); 
if (assembly != null) 
{ 
    System.Runtime.Remoting.ObjectHandle obj = 
     System.Activator.CreateInstance(assemblyName, className);    
} 

.NET 2.0互換性のあるコード

Assembly assembly = null; 
var className = "System.Boolean"; 
var assemblyName = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; 

foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    if (a.FullName == assemblyName) 
    { 
     assembly = a; 
     break; 
    } 
} 

if (assembly != null) 
{ 
    System.Runtime.Remoting.ObjectHandle obj = 
     System.Activator.CreateInstance(assemblyName, className); 
} 

あなたがいるか否かを判断する場合ファイルは存在する前に存在します広告は、それ(グッドプラクティス)、その後、あなたがその名前を持って、目的の場所を知っている与えられた、単にアセンブリが解決されているときに、ファイルを検索してみてください。

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 

var className = "StackOverflowLib.Class1"; 
var assemblyName = "StackOverflowLib.dll"; 
var currentAssemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
var obj = Activator.CreateInstance(Path.Combine(currentAssemblyPath, assemblyName), className); 

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var currentAssemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
    if (File.Exists(Path.Combine(currentAssemblyPath, args.Name))) 
    { 
     return Assembly.LoadFile(Path.Combine(currentAssemblyPath, args.Name)); 
    } 
    return null; 
} 
+0

@MrDisappointment、コードのおかげで。私が.Net 2.0で作業中であることを指定できませんでした –

+1

これはAppDomainに既にロードされているアセンブリのみを返しますか? – mmix

+0

@ mmixには有効なポイントがあります。私はロードされていないbinディレクトリにdllが存在するかもしれません。 –

1

アセンブリが不足している場合は、try/catch FileNotFoundExceptionを実行し、ロジックごとに状況を処理してください。

+0

本当に100%!しかし、例外が発生するのを待つのではなく、それをテストしたいと思います。 –

+0

私の頭の上では、完全なプロービングアルゴリズムをエミュレートしなければならないので、これを簡単に管理するとは思わない。また、エラーが発生しやすくなります(アプリケーションドメインは独自のプロービングプロセスをインストールする必要があります)。 最初に見たい場合は、このリンクをチェックしてください。 [ランタイムによるアセンブリの検索方法]:http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx – mmix

2

私はそれを回避しようとしない方がよいと思います例外。その理由は、あなたが

if (DoesAssemblyExist(asmName)) { 
    object = Activator.CreateInstance(typeName); 
} 
else { 
    MessageBox.Show("Assembly does not exist"); 
} 

のようなコードがある場合は、チェックと実際の作成の間で取り除かアセンブリが追加される可能性がありますプリエンプティブマルチタスクOS /中リスクが常に存在することです。はい、私はこのリスクが最小限であることを認識していますが、例外的なバリアントは原子的であるため、よりよく見えると思います。そのように、独自のuniqeキーを作成し、

使用しているすべての外部の.dllの場合:

-1

は、私はそれが将来的に誰かのために役立つことを願っ=「fjrj3288skckfktk4owoxkvkfk4o29dic」

文字列のキー。

そして、あなたはあなたのフォームをロードするとき、あなたが持っているすべての単一の外部の.dllのために、単純にキーがあるかどうか確認はそうのような存在:

もし(isMyLib.Variables.key ==キー) // continue

else // .dllは存在しないか破損しています。

関連する問題