无法以编程方式加载xll

我试图自动化一些Excel加载项的testing,这是在xllforms。 我在加载xll时遇到了一些问题。 我正在用C#编写它,我的代码如下所示:


using Microsoft.Office.Interop.Excel; Application xlApp; Workbook xlWorkBook; Worksheet xlWorkSheet; // create application, open workbook, etc ... // now try to register xll xlApp.RegisterXLL("C:\\SomePath\\Whatever.xll"); 

但是,这总是返回false。 当我通过录制macros手动加载xll时,我试着看看Excel暗中做了什么。 macros看起来像:


 Sub Macro1() ChDir "C:\SomePath" Application.RegisterXLL Filename:= _ "C:\SomePath\Whatever.xll" End Sub 

唯一的区别似乎是ChDir,所以我改变了我的代码:


 FileSystem.ChDir("C:\\SomePath"); xlApp.RegisterXLL("C:\\SomePath\\Whatever.xll"); 

但它仍然不起作用。 另一个奇怪的是,当我在RegisterXLL行之前放置一个断点并首先手动加载xll时,RegisterXLL方法将返回true。 但否则,它将返回false。

是的,ChDir命令可能很重要。 它可以帮助Windowsfind任何依赖于.x的DLL。 它不能解决您的问题的原因是FileSystem.ChDir()更改testing程序的工作目录,而不是Excel。

不是你可以做的全部的事情。 部署xll会做一个在系统PATH上的目录来解决这个问题。 一个实用的解决scheme就是运行这个macros。

我知道这不是直接回答你的问题,但你可能想看看在Visual Studio中使用VSTO。 VSTO将这些types的问题自动化。 VS 2010中的版本比以前好多了,你可以构build应用程序级插件,而不仅仅是文档级加载项。 如果您需要用户定义的函数,您可以使用如下所述的COM加载项:

http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx

它最初是基于这篇文章:

http://blogs.msdn.com/eric_carter/archive/2004/12/01/273127.aspx

我们将VSTO用于我们的主要应用程序,COM用于用户定义的function。 有什么好的是,他们被加载在同一个应用程序域,所以他们可以相互交谈。

感谢所有的build议。

我通过更改Excel应用程序的默认文件path来解决问题。

 Application.xlApp = new ApplicationClass(); xlApp.DefaultFilePath = "C:\\SomePath"; xlApp.RegisterXLL("Whatever.xll"); 

我遇到了在VBA代码中加载用户定义函数[UDF]的问题。 能够加载xll文件,但无法调用。

以下代码成功加载XLL文件,并从VBA代码中调用用户定义的函数。 在这个模块中可能会有redudendent指令,但是它可以工作!

 Sub InstallAddIn() On Error GoTo ErrorHandle Application.DefaultFilePath = "D:\\MyFolder" Application.RegisterXLL ("MyXLLFileName.xll") Set AI = AddIns.Add(Filename:="D:\MyFolder\MyXLLFileName.xll") If AddIns("MyXLLFileName").Installed Then LogInformation ("My XLL is installed") Else LogInformation ("My XLL is NOT installed") End If Exit Sub ErrorHandle: LogInformation ("------------------------") 'Logging function that I have written. Not a std api LogInformation (Err.HelpFile) LogInformation (Err.HelpContext) LogInformation (Err.Description) LogInformation ("Error in InstallAddIn module") LogInformation ("------------------------") End End Sub 

一个适当的解决办法是:

1-保存当前目录

  string CurrentDir = Directory.GetCurrentDirectory() 

2-然后你使用

  Directory.SetCurrentDirectory(dirXll); 

其中dirXll是你的xll的位置(参见GetExecutingAssembly())。

3-加载你的xll(RegisterXLL)

4-最后使用CurrentDir将当前目录设置回原来的位置。

不要忘记添加所有你xll是在你的xll相同的文件夹依赖的DLL。