是否可以使用 .Net 5 和非托管垫片创建 MS Office com 加载项?

问题描述

由于 VSTO 还没有移植到 .NET Core,我可以用老式的方式来做,并创建一个非托管的 shim 来加载 CLR 并托管托管的 .Core 5 加载项吗?

我的特定用例是 Outlook COM 加载项,目前使用 VSTO 针对 .NET 框架 4.7 构建,但我想开始利用 .NET 5。在与 Outlook 的交互方面,它只是在功能区上添加了一些按钮并对 Outlook 对象模型进行几次调用。例如,我不需要在 Excel 中执行诸如基于 VSTO 文档的加载项之类的操作。

我不想走 JS 之路,因为有相当多的 C# 代码需要移植。

我发现了这个 https://github.com/jozefizso/COMShimWizard/releases,它展示了如何使用 .NET 框架进行操作,并且我假设它与 VS 2010 中的填充向导所做的不完全相同。

由于我需要加载 .NET 5,我相信要加载 CLR,我需要按照此处概述的内容做一些事情:https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting

在我深入研究之前,这种方法是否可行?特别是,是否可以做必要的 COM 体操来实例化托管组件?

假设所有这些都是可行的,这是否或多或少等同于 VSTO 为 .NET 框架 4.x 所做的工作,即它是否在任何方面都不那么安全或性能较低,或者是否会有任何不会的功能与使用 VSTO 内置的插件相比是否可用?

更新 1

我做了一些更多的研究,这提出了一些额外的潜在问题。

  1. 对于 .NET 框架的情况,一旦将类加载到 CLR 中,就相对容易“解开”返回的引用以获取 COM 指针,该指针可用于访问该类型实现的 COM 接口。我不清楚在使用 netfxr 接口加载 .NET Core 运行时时如何做到这一点。
  2. .NET Core 没有应用域的概念,这是否意味着加载到 Core 运行时中的多个加载项不会被隔离,或者有什么方法可以实现某种程度的隔离?从我读到的内容来看,它们的堆可能至少会被隔离,但我不确定。

更新 2

从阅读此 https://github.com/dotnet/runtime/blob/main/docs/design/features/COM-activation.md 看来,在 Core 中,将程序集中类型作为 COM 服务器的请求将导致自动加载 Core 运行时(如果尚未加载)并在单独的 AssemblyLoadContext 中创建对象所以也许根本不需要垫片?另一方面,如果 Core 运行时已经加载并且版本确实与您尝试创建的类型所需的版本相匹配,那么该类型将无法加载,因此这似乎是一个问题......>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)