0

実行時に DLL を読み込んで使用しようとしていますが、これは正常に機能します。

var pluggin = asm2.CreateInstance("ParserTest.Interface", true) as iPluggin;

しかし、これはそうではありません (特定のフォルダー内の DLL ファイルをループして、iPluggin インターフェイスを実装する適切なファイルを見つける必要があります)。

...
var asm = Assembly.LoadFrom(dll.FullName);
if (asm.GetExportedTypes().FirstOrDefault(q => q.GetInterface(tName) != null) == null) continue;
Project.ProcessList.Add(asm.CreateInstance(tName, true) as iPluggin);
...

デバッグモードでいくつかの調査を行ったところ、次のことがわかりました。

asm.CreateInstance(tName, true)

は正しいオブジェクトを返しますが、それを iPluggin にキャストしようとすると、結果は null になります。理由はありますか?

4

2 に答える 2

0

私は似たようなことをしました:

private readonly Type _pluginbaseType = typeof(BasePlugin);

public AssemblyPlugin(Assembly assembly)
{

    Type[] _plugins = _assembly.GetExportedTypes()
        .Where(t => t.BaseType.IsSubclassOf(_pluginbaseType)
        .ToArray();
}

この後、次のことができます。

BasePlugin plugin = (BasePlugin)Activator.CreateInstance(pluginType);

インターフェイスではなく、基本クラスを選択する必要があります。

于 2012-09-14T18:07:12.277 に答える
0

よく分からないまま謎が解けました。

インターフェイスを定義する DLL (SDK.dll) は、チェックされたものの 1 つです。クエリで手動で削除し、すべての中華鍋を期待どおりに削除しました。これは私の最終的なコードです:

    var plugins =
        from fi in di.GetFiles("*.dll").Where(p => p.Name.ToUpper() != "SDK.DLL")
        let asm = Assembly.LoadFrom(fi.FullName)
        from t in asm.GetExportedTypes()
        where t.GetInterface(typeof(iPluggin).Name) != null
        select asm.CreateInstance(t.FullName, true) as iPluggin;
    Project.ProcessList.AddRange(plugins);
于 2012-09-14T18:37:41.053 に答える