gpt4 book ai didi

c# - 我如何获得*实际*主机应用程序实例?

转载 作者:行者123 更新时间:2023-11-30 12:57:46 27 4
gpt4 key购买 nike

我在 VBE 的 C# 插件中有这段代码(强调“VBE”:它不是 MS-Office 插件):

public abstract class HostApplicationBase<TApplication> : IHostApplication
where TApplication : class
{
protected readonly TApplication Application;
protected HostApplicationBase(string applicationName)
{
Application = (TApplication)Marshal.GetActiveObject(applicationName + ".Application");
}

其中 TApplication 是一个 MS-Office 互操作 Application 类,例如 Microsoft.Office.Interop.Excel.Application 类型;这里的 applicationName 参数将是“Excel”,嗯,Excel。

问题是 Marshal.GetActiveObject 似乎只返回创建的第一个 实例,而这不一定是托管当前 VBE 环境的实例和 this causes issues

如何获取实际宿主应用程序实例?

最佳答案

为了杀死僵尸,您可以通过以下方式获取 VBE 宿主的名称:

  • 检查将您带到主机的 CommandBarButton 的标题。该按钮位于标准工具栏上,但也在 View 菜单中。

  • 检查引用文献的名称。通常第一个不是 VBA 而是 BuiltIn 的引用。

  • 检查文档组件的 Properties 集合的 Application.Name 属性。

要可靠地获取对 VBE 主机的引用,您必须使用文档类型组件的 Properties 集合。例如,一旦您知道主机的名称 是“M​​icrosoft Excel”,您只需要找到工作簿文档组件(通常命名为 ThisWorkbook),然后您可以从该组件的属性集合。

            var appProperty = vbe.VBProjects
.Cast<VBProject>()
.Where(project => project.Protection == vbext_ProjectProtection.vbext_pp_none)
.SelectMany(project => project.VBComponents.Cast<VBComponent>())
.Where(component => component.Type == vbext_ComponentType.vbext_ct_Document
&& component.Properties.Count > 1)
.SelectMany(component => component.Properties.OfType<Property>())
.FirstOrDefault(property => property.Name == "Application");
if (appProperty != null)
{
Application = (TApplication)appProperty.Object;
}
else
{
Application = (TApplication)Marshal.GetActiveObject(applicationName + ".Application");
}

但并非所有 vbProject 都有文档类型组件,因此对于此类项目,您必须求助于 GetActiveObject 方法。

关于c# - 我如何获得*实际*主机应用程序实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32953450/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com