拡張機能用のエンジンを作成したいのですが、現在、多くの仮想関数を含む「モジュール」と呼ばれる基本クラスがあります。各拡張機能は、「モジュール」を継承し、独自のコードで関数 (ほとんどのフック) をオーバーライドするクラスです。
これらの拡張機能を別のバイナリに配置して、「その場で」ロードできるようにしたいと考えています。
これらのプラグインをロードするための単純なハンドラーを作成しました。
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)
これが私がやりたいことの例です:
拡張ハンドラーを含むホスト アプリケーションと、いくつかの独自の静的関数があります。ホスト アプリケーションは、バイナリ ファイルからモジュールをロードし、それをモジュールの配列に挿入します (これは、「モジュール」を継承するすべてのクラスのコンストラクターで行われることです。このモジュールには、ホスト アプリケーションの静的関数を呼び出すいくつかの関数が含まれています。私ができるようにする必要があるのは、静的関数のコードが含まれていないプラグインのソース コードであっても、ホスト アプリケーションのソース コードで定義されている静的関数を呼び出せるようにすることです。