Как получить местоположение папки из папки bin внутри dll-проекта?

#c# #dll

#c# #dll

Вопрос:

Я создаю проект dll. Для одного типа связи dll должна отправлять электронные письма на основе шаблонов .txt.

пример расположения папки :

 C:VisualStudioProjectsGeneratorAppBinDebug (Or release) Documents
  

для вызова папки, в которой находятся эти файлы .txt, я использовал (в проекте dll)

 var folderName = "Documents";
Path.Combine(Assembly.GetEntryAssembly().Location   folderName);
  

Сначала это сработало, но при вызове функции из dll через веб-сервис этот адрес больше не является правильным, что приводит к FileNotFoundExceptions .

папка documents и все ее файлы .txt копируются в выходную корзину. (Копировать всегда).

Я также попробовал следующие методы, которые, конечно, дали другие результаты, но не смогли мне помочь.

 Assembly.GetExecutingAssembly().Location
  

или

 var dm = typeof(AppDomainManager);
dm.Assembly.Location;
  

Есть мысли о том, как я могу решить эту проблему?

Редактировать:

Различные выходные данные, которые я получил:

 GetEntryAssembly = null => no location to grab
GetExecutingAssembly Location = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\#####\d37e9080\ff60155b\assembly\dl3\24596b30\c542f015_588ccf01\GeneratorApp.dll"
AppDomainManager Location = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll"
  

Комментарии:

1. Вы пытались выполнить дамп или отладку, чтобы увидеть адрес, по которому он пытается найти шаблоны? Что возвращается по пути. Объединить (Сборка. GetEntryAssembly() . Местоположение имя_фоЛьда) в рабочей среде?

2. @EugenePodskal: результаты см. в Отредактированном сообщении

3. Это выглядит так ASP.NET хостинг делает очень хорошую работу по запутыванию всего. Вы проверили содержимое этих каталогов?

4. Я действительно предлагаю вам создать запись в вашем web.config для таких путей. Таким образом, вы избавлены от необходимости восстанавливать свое местоположение по местоположению ваших сборок.

5. да, я сделал, и, кроме dll, нет папки, в которой будут храниться файлы .txt.

Ответ №1:

В документах говорится, что сборка.GetEntryAssembly() вернет сборку, которая использует вашу dll, потому что это начальная сборка, а не ваша dll.

Это сработало в вашем тестовом проекте, потому что все ваши exe и dll были в одном месте, что может быть иначе для вашей рабочей среды.

Попробуйте использовать сборку.Вместо этого GetExecutingAssembly() .

И вы уверены, что отметили эти файлы как Resource на вкладке Свойств?

Или вы можете попытаться внедрить эти шаблоны в качестве ресурсов в свою dll, если они представляют собой статические данные, которые не будут часто меняться

Комментарии:

1. Я попытаюсь добавить их как ресурсы, я свяжусь с вами с результатами