3

私はプラグイン アーキテクチャに関する研究論文に取り組んでおり、このコードを再作成しようとしています。これですべてが正しくなり、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;
    }
4

1 に答える 1

2

TargetSite は としてリストされているBoolean Register(Plugin_api.Plugin)ため、ここで NullReferenceException がスローされます。メソッドにブレークポイントを設定plugins.Addすると、内部のバッキング リストが null であり、入れようとしているプラ​​グインではないように見えます:)

Edit:あなたの更新を見た後、私が見ることができるすべてからプラグインが Null であるように見えます。プラグインはシンプルListですか?それともカスタムクラス?Add は何をしますか? その Register 行にブレークポイントを設定し、その動作を確認します。静的/グローバル オブジェクトを介してプラグインを初期化する場合、Heisenbug (デバッガーがアプリの状態を変更するため、デバッガーの下に表示されないバグ) が存在する可能性もありますが、それは単なる推測です。

于 2013-01-17T00:23:52.830 に答える