c# - 用 C++ 托管 CLR 运行时

标签 c# plugins clr clr-hosting

我正在开发一个项目的扩展,该扩展将允许在核心应用程序中托管 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# 端是静态的,这是我不希望的。此外,大多数不使用单独的应用程序域,而是全部在默认情况下执行。我不想要这个,因为它限制了卸载特定插件的能力。

如果缺少任何其他信息或需要任何其他信息,请随时告诉我。

最佳答案

我通过在 C# 方面使用 COM 公开接口(interface)解决了这个问题。

我已将 FrameworkAPI 放置在一个单独的 DLL 中,并将其主接口(interface)公开给 COM,然后在将使用它的插件中引用它。

通过启用 COM 进行编译,我可以导入 .tlb 生成的文件以轻松使用 C++ 中的接口(interface)。

关于c# - 用 C++ 托管 CLR 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13518434/

相关文章:

.net - .net core 源码中如何维护局部变量使用信息

c# - 在 CLR C++ 中用数组初始化 List<T>?

html - IE 在渲染过程中注入(inject) VBScript 标签,导致 HTML 格式错误

c# - 致命执行引擎错误 (79FFEE24) (80131506)

c# - 如何通过 Azure Batch 使用 Key Vault 进行身份验证

c# - 使用 Place API 在 xamarin android 中填充附近地点的 map

c# - 如何验证我的数据表是否为空

c# - 从代码启动音乐应用程序

eclipse - 发生内部错误: “Loading bundle[…]”

plugins - 为什么 'dokku plugins-install' 不能按预期工作?