如何从vsto插件中以编程方式加载自动插件(dll)

VSTO
VS2008 SP1
.NET 3.5
Excel 2007

我是一个.net noob。 我试图加载自动插件,这是一个Excel应用程序/自动化插件(这是一个DLL不xla或xll)从vsto插件的ThisAddIn_Startup()方法的vsto插件。 从谷歌我得到了下面的解决scheme,不工作。

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,但是当我尝试使用udfs从插件填充工作表时,我尝试在稍后的button_click方法中加载,我得到#NAME? 错误。 我不知道该怎么做。 任何帮助将不胜感激。

如果我首先尝试在Excel中调用udf,在调用button单击方法之前手动在单元格中键入udf,工作表填充工作,udfs按照预期进行评估,但这并不理想。

同样设置安装的属性为真,似乎没有做任何事情,因为我仍然可以看到在Excel中的UDF插件不活动,只有当我把它键入一个单元格,它被激活。 还有什么我需要做的,以激活自动化插件在我的VSTO启动?

谢谢!

我不确定你想在启动事件中这样做。 我已经做了类似的事情,但在可能适用之前,还不尽相同。 我在一个不同的事件处理程序中向COM中公开了一些COM可见的函数:

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

所以,也许你可以尝试加载你的自动化DLL这样? 这发生在启动事件触发之前… Excel可能正在做一些事情,如在启动事件正在处理时locking其插件列表 – 谁知道? 如果有可能知道Excel编程将不那么繁琐。

在VSTO和Automation中结合Excel似乎比较困难。 你可能会发现我的博客文章有帮助:

在Excel中与VSTO和UDF进行通信

只需要将string值添加到以下registry项,你是好的。

对于Office 2007

findregkey, HKEY_CURRENT_USER \ SOFtware \ Microsoft \ Office \ 12.0 \ Excel \ Options ,然后创buildstring值,其中name = OPEN ,value = / A“您的ADDIN NAME在这里” (引号也需要包含在内)

请注意,对于第一个插件,值名称应该被称为OPEN ,对于第二个插件,使用OPEN1OPEN2等等。

对于Office 2010

只要在上面的regkeypath中用14.0代替12.0 ,剩下的都是一样的。

看看下面的MSDN文章,这也将帮助你很多。

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

看起来这是VSTO特有的错误。 我把我的插件转换成一个COM插件,并能够使用代码自动插件。 我的团队已经把问题发送到微软,所以我们会看到他们说什么。