0

私は単純なdllを持っています。「インターフェイス」を使用して、dll をメイン アプリケーションにロードします。問題は、dll にフォームを持たせたいので、新しいフォームを dll プロジェクトに追加することです。しかし、dll をメイン アプリにロードして任意のメソッドを呼び出そうとすると、次のようになります: null 例外:

   ..
   Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();

   foreach (Type t in pluginTypes){
     M.ModuleInterface module = Activator.CreateInstance(t) as M.ModuleInterface;
     module.ReadAll(); // exception
   }

   // Exception I'm getting
   t.GenericParameterAttributes' threw an exception of type 'System.InvalidOperationException'

dll からフォームを削除すると、例外が消え、すべてが正常に機能します。フォームを追加してこの例外を修正するにはどうすればよいですか? ありがとう!

4

3 に答える 3

3

これは、dll のすべての型がインターフェイスを実装しているわけではないために発生する可能性がありModuleInterfaceます。

これを試して:

Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();

foreach (Type t in pluginTypes)
{
    if(t.GetInterfaces().Contains(typeof(ModuleInterface)))
    {
        var module = (ModuleInterface)Activator.CreateInstance(t);
        module.ReadAll(); // exception
    }
}
于 2013-09-06T14:34:16.567 に答える
0

dllメソッドでフォームを初期化していないためだと思います。フォームをパラメータとして渡してみてください。

于 2013-09-06T14:33:37.903 に答える
0

ループする前に、目的のタイプのすべての要素をフィルタリングする必要があります。

foreach(Type t in pluginTypes.Where(type=>typeof(M.ModuleInterface).IsAssignableFrom(type))){
   M.ModuleInterface module = Activator.CreateInstance(t) as M.ModuleInterface;
   module.ReadAll();
}
于 2013-09-06T14:49:54.677 に答える