【问题标题】:How do i load an automation addin (dll) programmatically from within a vsto addin如何从 vsto 插件中以编程方式加载自动化插件 (dll)
【发布时间】:2012-05-11 02:48:30
【问题描述】:

VSTO
VS2008 SP1
.NET 3.5
Excel 2007

我是一个 .net 菜鸟。我正在尝试从 vsto 插件的 ThisAddIn_Startup() 方法中的 vsto 插件中加载一个自动化插件,它是一个 excel 应用程序/自动化插件(它是一个 dll 不是 xla 或 xll)。从谷歌我得到了以下不起作用的解决方案。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{

        Application excel = Globals.ThisAddIn.Application;
        //Also tried without display alerts being set to false
        excel.DisplayAlerts = false;
        foreach (AddIn addin in excel.AddIns)
        {
            if (addin.progID.Equals("MY_ADDIN_PROG_ID"))
            {
                Debug.WriteLine("Addin installed is " + addin.Installed);
                addin.Installed = false;
                Debug.WriteLine("Addin is: " + addin.FullName + ", " + addin.progID);
                Debug.WriteLine("Addin installed is " + addin.Installed);
            }
        }
        AddIn addIn = excel.AddIns.Add("MY_ADDIN_PROG_ID", false);
        addIn.Installed = true;
        excel.DisplayAlerts = true;
        Debug.WriteLine("Addin is: " + addIn.FullName + ", " + addIn.progID);
        Debug.WriteLine("Addin installed is " + addIn.Installed);
        excel.DisplayAlerts = false;
        //OTHER STARTUP CODE
        Debug.WriteLine("Starting up addin!");
}

注意,我可以看到 addin.installed 在启动时被设置为 false 并返回 true,但是当我尝试使用插件中的 udf 填充工作表时,我尝试在稍后的 button_click 方法中加载,我得到 #NAME?错误。我不知道该怎么做。任何帮助将不胜感激。

如果我在调用按钮单击方法之前首先尝试通过在单元格中手动键入 udf 来调用 udf,则工作表填充会正常工作,并且 udf 会按预期进行评估,但这并不理想。

还将安装属性设置为 true 似乎没有做任何事情,因为我仍然可以看到 udf 插件在 excel 中处于非活动状态,只有当我将其键入单元格时它才会被激活。我还需要做些什么来激活我的 vsto 启动中的自动化插件吗?

谢谢!

【问题讨论】:

    标签: c# excel vsto user-defined-functions


    【解决方案1】:

    看起来这是 VSTO 特有的错误。我将我的插件转换为 COM 插件,之后就可以使用代码中的自动化插件了。我的团队已将此问题发送给 microsoft,因此我们将看看他们怎么说。

    【讨论】:

    • 你有错误报告的链接吗,我们有完全相同的问题:(但找不到解决方案
    【解决方案2】:

    只需将字符串值添加到以下注册表项即可。

    对于 Office 2007

    找到regkey,HKEY_CURRENT_USER\SOftware\Microsoft\Office\12.0\Excel\Options,然后创建字符串值,其中name = OPEN,value = /一个“您在此处添加的名称”(也需要包含引号。)

    请注意,对于第一个插件,值名称应称为 OPEN,对于第二个及以后,请使用 OPEN1OPEN2、 ...等等。

    对于 Office 2010

    只需将上述regkey路径中的12.0替换为14.0即可,其余都一样。

    查看下面 MSDN 上的文章,这对您也有很大帮助。

    http://support.microsoft.com/kb/291392

    【讨论】:

      【解决方案3】:

      在 Excel 中结合 VSTO 和自动化似乎比看起来更难。您可能会发现我的博文很有帮助:

      Communicating Between VSTO and UDF's in Excel

      【讨论】:

      • 谢谢肯德尔。我看到了这篇博文,但它没有提供关于我想要做什么的信息。自动化 udf 插件已经在 excel 中可用,我只需要在我用函数填充工作表时激活它。我没有重写自动化插件的奢侈。
      • 你是说你依赖于加载插件的顺序吗?这听起来是个坏主意。
      • 不,我不依赖于加载顺序。当我第一次尝试从我的 vsto 插件以编程方式填充带有函数的工作表时,自动化插件需要在开始 - > excel插件菜单中处于“活动状态”,否则我会得到#NAME?错误。此填充由按钮单击事件触发。但是由于某种原因,此时自动化插件未激活,仅手动将 udf 输入到单元格中会激活例如 =udf(.....)。如果我在手动输入 udf 后尝试以编程方式填充工作表,它工作正常,我可以看到自动化插件处于活动状态。
      • 我明白你的意思。不过,我不确定如何提供帮助。对不起:(
      【解决方案4】:

      我不确定您是否想在启动事件中执行此操作。我之前做过类似但不完全相同的事情,这可能适用。我在不同的事件处理程序中向 VBA 公开了一些 COM 可见函数:

      protected override object RequestComAddInAutomationService()
      {
          // return something com-visible
      }
      

      所以也许您可以尝试以这种方式加载您的自动化 dll?这发生在启动事件触发之前...... Excel 可能会在处理启动事件时锁定其插件列表 - 谁知道?如果可以知道 Excel 编程就不会那么乏味了。

      【讨论】:

      • 上述方法的不幸之处在于,您无法覆盖 GetType(),因此一旦将类设为 COM 可见,就无法使其 COM 不可见 :(
      • 感谢 Richard,很遗憾我没有编写自动化插件,因此无法重构它。我希望通过使用我的 vsto 插件中的这些 udf 以编程方式填充工作表来利用其中的一些 udf。然而,这似乎不是很简单。
      • 嘿,我想我的意思是您可以编写一个 COM 可见的包装器,将调用委托给该 dll。 COM 可见包装器将由 RequestComAddinAutomationService() 返回,这是您的 ThisAddin 类中的一个函数。
      猜你喜欢
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多