我正在为一个项目进行扩展,该项目将允许在核心应用程序中托管 CLR。有了这个,我计划允许这个扩展管理它在自身内部加载/卸载的托管扩展。话虽如此,我需要使用单独的 AppDomain 来确保可以卸载。
目前,我能够设置域并加载插件文件,但此时我被卡住了。我不确定如何随意调用域加载程序集内的函数等等。
到目前为止,这是我的加载设置,减去错误检查等:
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# 端都是静态的,这是我不想要的。此外,大多数不使用单独的 AppDomain,而是默认执行。我不想要这个,因为它限制了卸载特定插件的能力。
如果缺少任何其他信息并且需要,请随时告诉我。