私はプラグイン アーキテクチャに関する研究論文に取り組んでおり、このコードを再作成しようとしています。これですべてが正しくなり、dll ファイルは正しいディレクトリにありますが、コードを実行すると System.NullReferenceException が発生します。もちろん、これは私が目にする珍しい例外ではありませんが、何か奇妙なことがあります。通常、この例外が表示されると、いくつかのブレークポイントを追加して、それが壊れている場所を確認します。これがまさに私が行ったことであり、例外がスローされた時点でオブジェクトが null ではないことがわかりました! 誰でもこれを説明できますか?
これは私が実行したいコードです:
string args = Path.GetFileNameWithoutExtension(file);
Type oType = null;
try
{
Assembly asm = Assembly.LoadFile(file);
if (asm == null) return;
Type[] types = asm.GetTypes();
foreach (Type t in types)
{
// CHECK IF CURRENT TYPE IMPLEMENTS INTERFACE IPlugin
if (typeof(IPlugin).IsAssignableFrom(t))
{
IPlugin plugin = (IPlugin)Activator.CreateInstance(t);
plugin.Host = this;
plugins.Add(plugin);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
これはスローされる例外です:
null でないオブジェクト:
もう一つ。「this」がまだ初期化されていないことに関係があるのではないかと思いますが、コンストラクターの終了後にこのメソッドを呼び出す方法がわかりません。さまざまなイベントを使用して関数を呼び出してみましたが、何も改善されませんでした。
[編集]
ホスト プロパティ:
// Register the plugin if host is set
public IPluginHost Host {
get
{
return host;
}
set
{
host = value;
host.Register(this);
}
}
[別の編集] どうやら plugins.Add(plugin) 行でコードが壊れているようです!
public bool Register(IPlugin plugin)
{
plugins.Add(plugin);
return true;
}