2010-03-13 3 views
5

В VSTO Excel надстройку код:Открытие XML-файл находится в папке надстройку

Dim XMLDoc As XElement = XElement.Load("XMLFile1.xml") 

генерирует ошибку FileNotFound с сообщением (»Не удалось найти файл«C: \ Users \ Дуг \ Documents \ XMLFile1 .xml '. ") Он находится в папке Мои документы, но файл XML находится в папке VS Projects для этого проекта. Я установил свойство «Копировать в выходной каталог XML» в «Копировать всегда». Когда я изменяю код, чтобы включить полный путь к XML-файлу, код работает.

Кроме того, если я включил вышеуказанный код в Консоль Windows или проект другого типа, он работает правильно. Я получаю его только в Excel Addin. Вышеупомянутое верно для VSTO 2008/Excel 2003 и VSTO 2010/Excel 2010.

ответ

13

Когда вы используете относительный путь, для разрешения этого пути используется текущий каталог (Environment.CurrentDirectory). В случае надстройки VSTO это автоматически устанавливается в папку документов пользователя. Однако для консольного приложения это значение установлено в ту же папку, что и исполняемый файл, и именно поэтому вы испытываете разные типы поведения.

Если ваш файл будет развернут в той же папке, что и ваша надстройка надстройки VSTO, вы можете использовать (AppDomain.CurrentDomain.BaseDirectory) для создания полного пути к файлу.

Пример, в C#:

string filename = "XMLFile1.xml"; 

string path = Path.Combine(
    AppDomain.CurrentDomain.BaseDirectory, 
    filename); 

XElement.Load(path); 
+0

João, спасибо очень много. Это работает. –

+1

@ João, это блестяще. Не знаете, как вы нашли этот камень, так как я весь день бился и не мог найти ответ на эту проблему VSTO. Ваш ответ был на месте! Спасибо! –

+0

Все решения VSTO, которые я использовал '' Environment.CurrentDirectory'', чтобы получить рабочий каталог, который работал до вчерашнего дня, я сначала воспринял его как ошибку VS, поскольку это относительная переменная среды. Я попытался изменить VS рабочий каталог во многих отношениях ... без успеха. Большое спасибо @ João –

1

Вы также можете использовать:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase)