2009-11-19 5 views
3

У меня есть библиотека классов, которая использует некоторые XML-файлы, найденные в его собственном каталоге.C# Получить путь к библиотеке классов

При ссылке на эту библиотеку из другого проекта, как я могу гарантировать, что библиотека работает из своего собственного каталога?

Я попробовал Assembly.GetExecutingAssembly(). Место, но которое по-прежнему возвращает путь к проекту запуска.

+0

Ваш подход звучит правильно. Вы уверены, что вы (1) вызываете «GetExecutingAssembly» из вашей библиотеки и (2) вы не используете «локальную копию» библиотеки? – Heinzi

+0

(1) Да (2) dll скопирована в каталог проекта запуска, но файлы xml не копируются с ним. – djskinner

+0

Ну, (2) причина. Копирование выполняется с помощью Visual Studio, поэтому * работающее приложение * не имеет возможности узнать исходное местоположение этого файла. – Heinzi

ответ

14

Я знаю, что это старый пост, но в случае кто-то еще натыкается на него из поиска, самый простой способ я нашел, чтобы сделать это:

Public Class Foo 

    Public Shared Function GetMyPath() As String 
      Return Path.GetDirectoryName(GetType(Foo).Assembly.Location) 
    End Function 

End Class 
+0

Привет, что здесь '' Foo''? – iamserious

+4

@iamserious: Вы серьезно? – Leif

+4

@Leif, ха-ха-ха, я не помню, чтобы это (глупый) комментарий; возможно, был пьян, когда я это сделал. – iamserious

0

Я не думаю, что вы можете, если вы не запустите его в новом AppDomain, и это больше проблем, чем того стоит. Просто скопируйте нужные файлы в свой собственный проект и поместите их туда, где он ожидает относительно вашего рабочего каталога.

(Вы также можете задать первоначальный разработчик, почему пути к необходимым файлам не может быть дан в качестве параметра. Это было бы нормальным способ решения этой проблемы.)

+0

Я оригинальный разработчик, поэтому это может быть вариант, но я не хочу, чтобы отдельная копия одного и того же XML-файла для каждого проекта, использующего библиотеку, мне не нужна. – djskinner

0

Я уверен, есть некоторые функции, чтобы получить список загруженных сборок из ExecutingAssembly, перейдя через это, чтобы найти, что вы собираете (класс lib), затем получите его местоположение. Извините за неопределенный ответ.

6

Это происходит потому, что ваш проект запуска имеет два варианта, как для загрузки библиотеки

  1. Скопируйте его в его собственную папку (что может вызвать поведение вы экспериментируете)
  2. Загрузите его из GAC (то, что сделало бы невозможным, чтобы загрузить любой XML из его папки)

Так у вас есть два варианта здесь:

  1. Импортируйте XML-файлы в проект и внедрите их как «внедренные ресурсы» в библиотеке классов и загрузите их в память во время выполнения.
  2. Импортируйте файлы XML в проект и измените свойство «копировать в выходной каталог» файла на «истину».
+0

Пункт 2 работал. Однако это не идеальное решение, так как могут быть столкновения. Причина, по которой он не работал раньше, заключается в том, что у меня также был каталог Data в другом проекте с ссылкой. – djskinner

+0

Используйте вариант 1, а не так .. но пользователи приложений не смогут редактировать XML-файлы. Я не вижу других вариантов. –

+0

Чтобы добавить еще один вариант: поместите файлы XML в какой-то определенный каталог данных и сохраните этот путь к каталогу в app.config. После вас вы * будете * развертывать свой проект на других ПК и использовать его вне Visual Studio, не так ли? – Heinzi

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