繁体   English   中英

如何从共享库访问VSTO加载项的CustomTaskPanes属性?

[英]How to access the CustomTaskPanes property aof a VSTO AddIn from a shared library?

我正在为Word,Excel,PowerPoint构建一个AddIn。 该插件具有功能区。 每当用户单击功能区上的按钮时,都会在侧面打开自定义任务窗格。 因为我不想在三个不同的项目中重写相同的代码,所以我有一个共享项目,其中定义了功能区(XML)。

问题:功能区回调必须访问CustomTaskPanes属性。

我试图将CustomTaskPanes属性注入到共享功能区:

public partial class ThisAddIn
{
  protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
  {
    return new Shared.Ribbon(this.CustomTaskPanes);
  }
}

public class Ribbon : Office.IRibbonExtensibility
{
  private Microsoft.Office.Tools.CustomTaskPaneCollection taskPanes;

  public Ribbon(Microsoft.Office.Tools.CustomTaskPaneCollection taskPanes)
  {
    this.taskPanes = taskPanes;
  }
}

但是在执行此方法时, CustomTaskPanes属性为null ,这意味着我正在注入null

更改功能区的构造函数以使我们可以将AddIn注入功能区也不起作用,因为CustomTaskPanes属性是内部属性,因此代码将引发异常:

public partial class ThisAddIn
{
  protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
  {
    return new Shared.Ribbon(this);
  }
}

public class RecordsRibbon : Office.IRibbonExtensibility
{
  private dynamic addIn;

  public RecordsRibbon(dynamic addIn)
  {
    this.addIn = addIn;
  }

  private void OpenTaskPane()
  {
    // RuntimeBinderException with message: 'ThisAddIn.CustomTaskPanes' is
    // inaccessible due to its protection level
    var taskPane = this.addIn.CustomTaskPanes.Add(new UserControl(), "title");
    var taskPane.Width = 400;
    var taskPane.Visible = true;
  }
}

我不想更改ThisAddIn.CustomTaskPanes属性的访问修饰符,因为它是设计人员生成的代码。

我也尝试了反射,这导致MissingMethodException

  System.Type t = this.addIn.GetType();
  var ctps = t.InvokeMember(
    "get_CustomTaskPanes",
     BindingFlags.InvokeMethod | BindingFlags.NonPublic,
     null,
     this.addIn,
     null);
  var ctps = t.InvokeMember(
    "get_CustomTaskPanes",
     BindingFlags.GetProperty| BindingFlags.NonPublic,
     null,
     this.addIn,
     null);
  var ctps = t.InvokeMember(
    "CustomTaskPanes",
     BindingFlags.GetProperty | BindingFlags.NonPublic,
     null,
     this.addIn,
     null);

从共享库访问外接程序的自定义任务窗格集合,我还能做什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM