6

いくつかの .dll ファイルを動的に読み込もうとしています。ファイルは、少なくとも 1 つのクラスを実装するプラグイン (今のところ自己作成) ですMyInterface。各ファイルについて、次のことを行っています。

    Dictionary<MyInterface, bool> _myList;

    // ...code

    Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
    foreach (Type type in assembly.GetTypes())
    {
        var myI = type.GetInterface("MyInterface");
        if(myI != null)
        {
            if ((myI.Name == "MyInterface") && !type.IsAbstract)
            {
                var p = Activator.CreateInstance(type);
                _myList.Add((MyInterface)p, true);
            }
        }
    }

これを実行するとキャスト例外が発生しますが、回避策が見つかりません。とにかく、なぜこれがまったく機能しないのか疑問に思っています。.NET Framework 3.5 でのソリューションを探しています。

私に起こったもう1つのことは、上記のコードに新しいエントリを追加する前に、次のことを実行した後nullに入ることでした:p_myList

var p = type.InvokeMember(null, BindingFlags.CreateInstance, null,
                          null, null) as MyInterface;

pこのコードは、プラグインをロードするための最初の試みでした。理由はnullまだわかりませんでした。誰かが私を正しい道に導いてくれることを願っています:)

4

3 に答える 3

5

型をインターフェイスにキャストできるかどうかを確認するはるかに簡単な方法があります。

Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
foreach (Type type in assembly.GetTypes())
{
    if(!typeof(MyInterface).IsAssignableFrom(type))
        continue;

    var p = Activator.CreateInstance(type);
    _myList.Add((MyInterface)p, true);
}

が false の場合IsAssignableFrom、継承に何か問題があり、それがエラーの原因である可能性が最も高いです。

于 2012-08-08T16:11:30.450 に答える
4

Jon Skeet によるPlug-ins and cast exceptionsを実際に読んで、表示される動作とプラグイン フレームワークを適切に実行する方法を説明する必要があります。

于 2012-08-08T16:18:06.077 に答える
1

次のコードを調べてください。Type.IsAssignableFrom(Type type)がこの状況で役立つ と思います。

Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
///Get all the types defined in selected  file
Type[] types = assembly.GetTypes();

///check if we have a compatible type defined in chosen  file?
Type compatibleType = types.SingleOrDefault(x => typeof(MyInterface).IsAssignableFrom(x));

if (compatibleType != null)
{
    ///if the compatible type exists then we can proceed and create an instance of a platform
    found = true;
    //create an instance here
    MyInterface obj = (ALPlatform)AreateInstance(compatibleType);

}
于 2012-08-08T16:12:23.243 に答える