2010-07-07 2 views
2

Я пытаюсь автоматизировать некоторые тесты для надстройки Excel, которая находится в форме xll. У меня есть некоторые проблемы при загрузке xll. Я пишу это в C#, и мой код выглядит следующим образом:Невозможно загрузить xll программно


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"); 

Однако это всегда возвращает ложь. Я пытаюсь увидеть, что Excel тайно делает, когда я загружаю xll вручную, записывая макрос. Макрос выглядит следующим образом:


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.

ответ

2

Спасибо за все предложения.

Я решил проблему, изменив путь к файлу по умолчанию для приложения Excel.

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

Как отменить регистрацию Excel AddIn ... – Ocean

2

Да, команда ChDir может быть важной. Это помогает Windows найти любые DLL-файлы, от которых зависит любое. Причина, по которой он не решает вашу проблему, заключается в том, что FileSystem.ChDir() изменяет рабочий каталог для вашей тестовой программы, а не Excel.

Не полный колодец, который вы можете сделать. Развертывание xll приведет к тому, что каталог, находящийся в системе PATH, решит его. Прагматичным решением является просто запустить этот макрос.

1

Я знаю, что это не прямой ответ на ваш вопрос, но вы можете захотеть использовать VSTO в Visual Studio. VSTO автоматизирует многие из этих проблем. Версия в VS 2010 намного лучше, чем у них, и вы можете создавать надстройки уровня приложений, а не только надстройки уровня документа. Если вам нужны пользовательские функции, которые вы можете использовать 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 для пользовательских функций. Что приятно в том, что они загружаются в один и тот же домен приложения, чтобы они могли разговаривать друг с другом.

+0

Эй, Эрик, мне было интересно, можете ли вы объяснить, как вы подгоняете управляемую надстройку автоматизации в тот же AppDomain, что и VSTO? Звучит очень круто. –

+0

Майк, На самом деле я не уверен, почему это так. Раньше мы использовали удаленный доступ, который вызывал проблемы при попытке использовать приложение с помощью служб терминалов. Мы проверяем, зарегистрирован ли COM-админ, и если он не зарегистрирован в Regasm.exe. Если вы проверяете домены приложений каждого (AppDomain.CurrentDomain.FriendlyName), вы должны увидеть его (наш - «PrevisionAddIn.vsto»). Мы используем глобальный класс со свойством, которое ссылается на экземпляр Excel и интерфейс UDF на основной код. Класс COM UDF - это действительно оболочка, которая передает вызовы на главный код. Обратите внимание, что это использует VS 2010 и Excel 2007. – Erick

+0

Спасибо Эрик, это интересно. Я делал такие вещи с недвусмысленными решениями. Я не знал, что они оба будут подстегивать один и тот же AppDomain, если вы это сделаете. Очень здорово это знать, спасибо! –

0

У меня возникли проблемы с загрузкой пользовательской функции [UDF] в код VBA. Мог загрузить xll-файл, но не смог позвонить.

Следующий код успешно загружает файлы XLL и позволяет нам вызывать пользовательскую функцию из кода VBA. В этом модуле может быть переопределенная инструкция, но она работает!

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

Правильное решение будет:

1- сохранить текущий каталог с

string CurrentDir = Directory.GetCurrentDirectory() 

2- затем использовать

Directory.SetCurrentDirectory(dirXll); 

где dirXll является расположение вашего xll (cf GetExecutingAssembly()).

3 Загрузите Xll (RegisterXLL)

4- и Finaly использования CurrentDir установить текущий каталог обратно в исходное местоположение.

Не забудьте добавить все библиотеки DLL, к которым вы добавили xll, в той же папке, что и xll.

Смежные вопросы