8

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

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

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

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

4

4 に答える 4

10

あなたの質問に対する私のコメントに気付いた場合、あなたがこれについてどのように望んでいるか、またはこれを行う必要があるかを正確に正確に確信していないことは明らかですが、より詳細な説明ができるまで、これを提供できることを願っていますあなたの状況にうまく適合します(重要なのはアセンブリの「検索」にあります):

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;
}
于 2011-02-07T09:35:13.193 に答える
2

例外を避けようとしない方がいいと思います。その理由は、あなたが次のようなコードを持っている場合です

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

プリエンプティブマルチタスクOSには、チェックと実際の作成の間にアセンブリが追加/削除される可能性があるというリスクが常にあります。はい、私はこのリスクが最小限であることを認識していますが、それでも例外バリアントはアトミックであるため、見栄えが良いと思います。

于 2011-02-07T10:06:20.650 に答える
1

FileNotFoundExceptionアセンブリの欠落は間違いなく例外を構成し、ロジックに従って状況を試行/キャッチして処理します。

于 2011-02-07T09:33:31.527 に答える