#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. Я попытаюсь добавить их как ресурсы, я свяжусь с вами с результатами