C# 如何从vsto加载项中以编程方式加载自动化加载项(dll)

C# 如何从vsto加载项中以编程方式加载自动化加载项(dll),c#,excel,vsto,user-defined-functions,C#,Excel,Vsto,User Defined Functions,VSTO VS2008 SP1 .NET 3.5 Excel 2007 我是一个.NETNoob。我试图从VSTO ADIN的TestAddiNi StutpUp()方法中,在VSTO ADIN中加载一个Excel应用程序/自动化插件(它是DLL,而不是XLA或XLL)的自动化ADIN。从谷歌我得到了下面的解决方案,这是不工作的 private void ThisAddIn_Startup(object sender, System.EventArgs e) { Applica

VSTO
VS2008 SP1
.NET 3.5
Excel 2007

我是一个.NETNoob。我试图从VSTO ADIN的TestAddiNi StutpUp()方法中,在VSTO ADIN中加载一个Excel应用程序/自动化插件(它是DLL,而不是XLA或XLL)的自动化ADIN。从谷歌我得到了下面的解决方案,这是不工作的

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,但是当我尝试使用我试图在稍后的按钮单击方法中加载的addin中的UDF填充工作表时,我得到了35; NAME?错误我束手无策。任何帮助都将不胜感激

如果在调用按钮单击方法之前,我首先尝试在excel中手动在单元格中键入自定义项来调用该自定义项,则工作表填充会起作用,并且自定义项会按预期进行求值,但这并不理想

另外,将installed属性设置为true似乎没有任何作用,因为我仍然可以在excel中看到udf加载项处于非活动状态,只有在将其键入单元格时,它才会被激活。我还需要做什么来激活vsto启动中的自动化加载项


谢谢

我不确定您是否希望在启动事件中执行此操作。我曾经做过类似的事情,但以前可能不太一样。我在不同的事件处理程序中向VBA公开了一些COM可见函数:

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

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

我不确定您是否希望在启动事件中这样做。我曾经做过类似的事情,但以前可能不太一样。我在不同的事件处理程序中向VBA公开了一些COM可见函数:

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

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

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


将VSTO与Excel中的自动化结合起来比看起来更难。您可能会发现我的博客文章很有帮助:


只需将字符串值添加到以下注册表项,就可以了

适用于Office 2007

找到regkey,HKEY\U CURRENT\U USER\SOftware\Microsoft\Office\12.0\Excel\Options,然后创建字符串值,其中name=打开,value=/A“您的加载项名称在此”(也需要包含引号)

请注意,对于第一个外接程序,值名称应称为OPEN,对于第二个及以后的外接程序,请使用OPEN1OPEN2。。。等等

适用于Office 2010

只需将上述regkey路径中的12.0替换为14.0,其余都是相同的

查看下面关于MSDN的文章,这也将对您有很大帮助


只需将字符串值添加到以下注册表项,就可以了

适用于Office 2007

找到regkey,HKEY\U CURRENT\U USER\SOftware\Microsoft\Office\12.0\Excel\Options,然后创建字符串值,其中name=打开,value=/A“您的加载项名称在此”(也需要包含引号)

请注意,对于第一个外接程序,值名称应称为OPEN,对于第二个及以后的外接程序,请使用OPEN1OPEN2。。。等等

适用于Office 2010

只需将上述regkey路径中的12.0替换为14.0,其余都是相同的

查看下面关于MSDN的文章,这也将对您有很大帮助


看起来这是VSTO特有的错误。我将我的外接程序转换为COM外接程序,并能够从代码中使用自动化外接程序。我的团队已将问题发送给microsoft,我们将看看他们怎么说。

看起来这是VSTO特有的错误。我将我的外接程序转换为COM外接程序,并能够从代码中使用自动化外接程序。我的团队已将此问题发送给microsoft,我们将看看他们怎么说。

上述方法的一个不幸之处是,您无法覆盖GetType(),因此,一旦使COM类可见,就无法使其COM不可见:(感谢Richard,不幸的是,我没有编写自动化加载项,因此无法重构它。我希望通过从我的vsto加载项以编程方式使用这些自定义项填充工作表,从而利用其中的一些自定义项。但是,这似乎不是很简单。嘿,我想我的意思是,您可以编写一个COM可见的包装,用于删除gates调用该dll。COM visible包装器将由RequestComAddinAutomationService()返回,它是ThisAddin类中的一个函数。上述方法的不幸之处在于,您无法覆盖GetType(),因此,一旦使类COM可见,就无法使其COM不可见:(感谢Richard,不幸的是,我没有编写自动化加载项,因此无法重构它。我希望通过从我的vsto加载项以编程方式使用这些自定义项填充工作表,从而利用其中的一些自定义项。但是,这似乎不是很简单。嘿,我想我的意思是,您可以编写一个COM可见的包装,用于删除gates调用该dll。COM可视包装器将由RequestComAddinAutomationService()返回,这是ThisAddin类中的一个函数。谢谢Kendall。我看到了这篇博文,但它没有提供有关我正在尝试执行的操作的信息。automation udf加载项已经可用