コア アプリケーション内で CLR をホストできるようにするプロジェクトの拡張に取り組んでいます。これにより、この拡張機能が内部でロード/アンロードするマネージド拡張機能を管理できるようにする予定です。そうは言っても、アンロードが可能であることを確認するには、別の AppDomains を使用する必要があります。
現在、ドメインをセットアップしてプラグイン ファイルをロードすることはできますが、その時点で行き詰まります。ドメインがロードされたアセンブリ内で自由に関数を呼び出す方法などはわかりません。
エラーチェックなどを除いた、これまでの読み込み設定は次のとおりです。
ICorRuntimeHost* lpRuntimeHost = NULL;
CorBindToRuntimeEx( L"v4.0.30319", L"wks", 0, CLSID_CorRuntimeHost, IID_PPV_ARGS( &lpRuntimeHost ) );
lpRuntimeHost->Start();
// File data read from disk.
// Dll file just CreateFile/ReadFile and insert into pluginFileData.
CComSafeArray<BYTE> pluginFileData;
IUnknown* lpUnknown = NULL;
lpRuntimeHost->CreateDomain( wstrPlugin.c_str(), NULL, &lpUnknown );
CComPtr<_AppDomain> appDomain = NULL;
lpUnknown->QueryInterface( &appDomain.p );
CComPtr<_Assembly> appAssembly = NULL;
hResult = appDomain->Load_3( pluginFileData, &appAssembly );
プラグインと見なされるために、すべてのプラグインが参照および使用する必要があるクラス ライブラリがあります。これまでのところ、継承する基本クラスにすぎません。
namespace FrameworkAPI
{
public class IFrameworkPlugin
{
public override bool Initialize(IntPtr interfaceObj)
{
return false;
}
}
}
次に、拡張機能がそのクラス ライブラリを参照し、それをベースとして使用します。
namespace ClassLibrary1
{
public class Main : IFrameworkPlugin
{
public override bool Initialize(IntPtr interfaceObj)
{
// Return true to stay loaded.
return true;
}
}
}
私が立ち往生しているのは、いくつかのことを行う方法です:
- メインクラスを取得するにはどうすればよいですか?ただし、メインクラスが引き続き処理できるようにするベース内のメソッドを呼び出すベースとしては?
- メインクラスがベースを継承して、有効なプラグインファイルであることを確認するにはどうすればよいですか?
- C++ 側からメソッドを自由に呼び出して、C# プラグインでイベントを発生させる方法。
起動イベントの場合、C++ プラグインは、イベントのレンダリング、コマンド処理など、ロードされると C# プラグインでより多くのものを呼び出します。
私がオンラインで見つけた例のほとんどは、C# 側全体を静的にする必要があることに固有のものであり、これは望ましくありません。また、ほとんどは個別の AppDomains を使用せず、すべてデフォルトで実行されます。特定のプラグインをアンロードできることが制限されるため、これは望ましくありません。
他の情報が不足していて必要な場合は、お気軽にお知らせください。