0

拡張機能用のエンジンを作成したいのですが、現在、多くの仮想関数を含む「モジュール」と呼ばれる基本クラスがあります。各拡張機能は、「モジュール」を継承し、独自のコードで関数 (ほとんどのフック) をオーバーライドするクラスです。

これらの拡張機能を別のバイナリに配置して、「その場で」ロードできるようにしたいと考えています。

これらのプラグインをロードするための単純なハンドラーを作成しました。

    public static bool LoadMod(string path)
    {
        try
        {
            if (File.Exists(path))
            {
                System.Reflection.Assembly library = System.Reflection.Assembly.LoadFrom(path);
                if (library == null)
                {
                    Program.Log("Unable to load " + path + " because the file can't be read", true);
                    return false;
                }
                Type[] types = library.GetTypes();
                Type type = library.GetType("wmib.RegularModule");
                Type pluginInfo = null;
                foreach (Type curr in types)
                {
                    if (curr.IsAssignableFrom(type))            
                    {
                        pluginInfo = curr;
                        break;
                    }
                }
                if (pluginInfo == null)
                {
                    Program.Log("Unable to load " + path + " because the library contains no module", true);
                    return false;
                }
                Module _plugin = (Module)Activator.CreateInstance(pluginInfo);
                return true;
            }
        }
        catch (Exception fail)
        {
            core.handleException(fail);
        }
        return false;
    }

私の問題は、これらのモジュールが、ホスト アプリケーションにある静的クラスの関数を呼び出していることです。拡張のソース コードでこの静的クラスの「スケルトン」を作成することは可能ですか? 同じ名前とパラメーターの空の関数を使用して 2 番目のソース コードでクラスを作成しようとしましたが、何らかの理由で機能しません (ロードしようとするたびに、呼び出しのターゲットによって例外がスローされました。 System.Reflection.MonoCMethod.Invoke の mscorlib)

これが私がやりたいことの例です:

拡張ハンドラーを含むホスト アプリケーションと、いくつかの独自の静的関数があります。ホスト アプリケーションは、バイナリ ファイルからモジュールをロードし、それをモジュールの配列に挿入します (これは、「モジュール」を継承するすべてのクラスのコンストラクターで行われることです。このモジュールには、ホスト アプリケーションの静的関数を呼び出すいくつかの関数が含まれています。私ができるようにする必要があるのは、静的関数のコードが含まれていないプラグインのソース コードであっても、ホスト アプリケーションのソース コードで定義されている静的関数を呼び出せるようにすることです。

4

1 に答える 1

0

わかりました、実際には思ったほど難しくありません。ホストバイナリを拡張機能に参照しただけで、拡張機能でホストのすべての静的要素とクラスが有効になりました。

于 2012-11-05T15:27:20.817 に答える