Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сказать приложению, где искать ассембли? / 25 сообщений из 29, страница 1 из 2
23.11.2017, 15:04
    #39558335
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Есть живой пример:
https://powerbi.microsoft.com/en-us/desktop/

Интересная утилита.

Я хочу приконнектиться к PostgreSQL, пишет ошибку.
После установки провайдера для постгреса Npgsql в GC - подключается к постгресу и т.д.

Вопрос: можно ли заставить приложение искать Npgsql.dll не в GC, а в текущем фолдере, куда я просто его скопирую?
...
Рейтинг: 0 / 0
23.11.2017, 15:43
    #39558395
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
...
Рейтинг: 0 / 0
23.11.2017, 17:01
    #39558476
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
buserРолг Хупин, How the Runtime Locates Assemblies

Сделал так:

1. создал фолдер DLLS внутри фолдера BIN, откуда запускается эхэ, и скопировал туда Npgsql.dll
2. В конфиг файл приложения добавил

Код: c#
1.
2.
3.
4.
5.
  <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="DLLS;"/>
    </assemblyBinding> 
  </runtime>



Всеравно не видит провайдер, если установить его в GC - тогда видит.
...
Рейтинг: 0 / 0
23.11.2017, 17:19
    #39558489
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг ХупинbuserРолг Хупин, How the Runtime Locates Assemblies

Сделал так:

1. создал фолдер DLLS внутри фолдера BIN, откуда запускается эхэ, и скопировал туда Npgsql.dll
2. В конфиг файл приложения добавил

Код: c#
1.
2.
3.
4.
5.
  <runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="DLLS;"/>
    </assemblyBinding> 
  </runtime>



Все равно не видит провайдер, если установить его в GC - тогда видит.
Убрать точку с запятой в конце имени папки в privatePath. Предупреждаю сразу: относительные пути в этом элементе - только относительно папки расположения exe вглубь этой папки. И вроде как абсолютные пути этот элемент тоже не поддерживает. При каком-то более другом расположении копать в сторону AppDomain.AssemblyResolve Event .
...
Рейтинг: 0 / 0
23.11.2017, 17:20
    #39558490
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг Хупин,
У нас в папке exe и
Conn = new NpgsqlConnection (string)
...
Рейтинг: 0 / 0
23.11.2017, 17:24
    #39558492
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
P.S. Чтобы не создавать папку для библиотек руками, и не копировать ни руками, ни в post-build event'е - добавить в .csproj:
Код: xml
1.
2.
3.
4.
5.
6.
<Target Name="AfterBuild">
  <ItemGroup>
    <MoveToLibFolder Exclude="$(OutputPath)$TargetName.pdb" Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
  </ItemGroup>
  <Move SourceFiles="@(MoveToLibFolder)" DestinationFolder="$(OutputPath)DLLS" OverwriteReadOnlyFiles="true" />
</Target>


Ну, или установить PrettyBin . Он заодно автоматом вносит нужные модификации и в конфиг.
...
Рейтинг: 0 / 0
23.11.2017, 17:26
    #39558493
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Сон Веры ПавловныP.S. Чтобы не создавать папку для библиотек руками, и не копировать ни руками, ни в post-build event'е - добавить в .csproj:
Код: xml
1.
2.
3.
4.
5.
6.
<Target Name="AfterBuild">
  <ItemGroup>
    <MoveToLibFolder Exclude="$(OutputPath)$TargetName.pdb" Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
  </ItemGroup>
  <Move SourceFiles="@(MoveToLibFolder)" DestinationFolder="$(OutputPath)DLLS" OverwriteReadOnlyFiles="true" />
</Target>


Ну, или установить PrettyBin . Он заодно автоматом вносит нужные модификации и в конфиг.

да, но в данном случае - это приложение не моё, Майкрософта.
Я просто хотел бы избежать установки провайдера в GC.
...
Рейтинг: 0 / 0
23.11.2017, 17:39
    #39558509
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг Хупинда, но в данном случае - это приложение не моё, Майкрософта.
Я просто хотел бы избежать установки провайдера в GC.
Ну конфиг у этого приложения имеется? Если да - откорректируйте его вручную, и вручную создайте папки/скопируйте файлы. Если нет - тогда ой.
...
Рейтинг: 0 / 0
23.11.2017, 23:18
    #39558642
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
cкажите пусть ищет в ООН.
Сборки можно загрузить в домен и во время выполнения, если сильно надо, не зависимо от каких либо путей.
...
Рейтинг: 0 / 0
24.11.2017, 03:05
    #39558689
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Roman MejtesСборки можно загрузить в домен и во время выполнения, если сильно надо, не зависимо от каких либо путей.
И у стороннего приложения без исходников?
...
Рейтинг: 0 / 0
24.11.2017, 11:55
    #39558882
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Сон Веры ПавловныРолг Хупинда, но в данном случае - это приложение не моё, Майкрософта.
Я просто хотел бы избежать установки провайдера в GC.
Ну конфиг у этого приложения имеется? Если да - откорректируйте его вручную, и вручную создайте папки/скопируйте файлы. Если нет - тогда ой.

да, выше я описал, что сделал

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1278038&msg=20978682

Не верится, что нет решения через конфиг.
...
Рейтинг: 0 / 0
24.11.2017, 12:29
    #39558921
Jenyok2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Хочу присоединиться к данной теме.
Есть вопросы по assembly.
.
Например.
Есть папка C:\Work\Program2\Bin\ где лежит исполняемый модуль программы A1.exe .
Данный программный модуль A1.exe вызывает некую стороннюю DLL (DLL1.dll), которая лежит в папке C:\Work\Program1\ .
Папки C:\Work\Program1\ , C:\Work\Program2\Bin\ НЕ входят в переменную окружения %Path% и не являются системными.
.
Как сделать так, чтобы программный модуль A1.exe в папке C:\Work\Program2\Bin\ при старте программы находил DLL (DLL1.dll) в папке C:\Work\Program1\ ?
.
Из условия видно, что папка C:\Work\Program1\ не является подпапкой папки C:\Work\Program2\Bin\ ?
.
Жду Ваших ответов.
.
...
Рейтинг: 0 / 0
24.11.2017, 12:51
    #39558942
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг ХупинНе верится, что нет решения ч
Выше писал как у нас, не работает?
...
Рейтинг: 0 / 0
24.11.2017, 12:56
    #39558949
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Jenyok2,
Ты с расчётом на windows installer смотри.
Т.е. юзверь инсталлятором ставит либо расшаренную длл на несколько программ, либо только для одной.
Если для одной, то рядом с exe и кидай.
...
Рейтинг: 0 / 0
24.11.2017, 13:07
    #39558961
Jenyok2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Petro123Jenyok2,
Ты с расчётом на windows installer смотри.
Т.е. юзверь инсталлятором ставит либо расшаренную длл на несколько программ, либо только для одной.
Если для одной, то рядом с exe и кидай.
.
Условия задачи совсем другие.
Смысл такой, что в папке C:\Work\Program1\ находится сторонняя программа с DLL1.dll, которая периодически обновляется, в том числе обновляется файл DLL1.dll .
Т.е. при каждом обновлении сторонней программы в паке C:\Work\Program1\ необходимо НЕ забывать обновить (скопировать) DLL1.dll в папку C:\Work\Program2\Bin\ с программой A1.exe . Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
Поэтому и вопрос как загрузить DLL1.dll из папки C:\Work\Program1\ программой A1.exe запущенной из папки C:\Work\Program2\Bin\ .
.
Хотелось бы увидеть пример кода.
.
Жду Ваших ответов.
...
Рейтинг: 0 / 0
24.11.2017, 13:30
    #39558986
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Jenyok2Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
А то что можно забыть про абсолютный прибитый гвоздями путь ничего?
Студия АВТОМАТИЧЕСКИ копирует длл при подготовке релиза рядом с exe.
Обновлять setup.exe а не руками.
Ну, или в приложении вбивай путь гвоздями.
...
Рейтинг: 0 / 0
24.11.2017, 13:33
    #39558989
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Jenyok2,
- узнать путь exe
- на ранг выше папку
- добавляем program2/bin
- копируем к себе или грузим длл в динамике.
...
Рейтинг: 0 / 0
24.11.2017, 14:10
    #39559030
Addx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Jenyok2Petro123Jenyok2,
Ты с расчётом на windows installer смотри.
Т.е. юзверь инсталлятором ставит либо расшаренную длл на несколько программ, либо только для одной.
Если для одной, то рядом с exe и кидай.
.
Условия задачи совсем другие.
Смысл такой, что в папке C:\Work\Program1\ находится сторонняя программа с DLL1.dll, которая периодически обновляется, в том числе обновляется файл DLL1.dll .
Т.е. при каждом обновлении сторонней программы в паке C:\Work\Program1\ необходимо НЕ забывать обновить (скопировать) DLL1.dll в папку C:\Work\Program2\Bin\ с программой A1.exe . Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
Поэтому и вопрос как загрузить DLL1.dll из папки C:\Work\Program1\ программой A1.exe запущенной из папки C:\Work\Program2\Bin\ .
.
Хотелось бы увидеть пример кода.
.
Жду Ваших ответов.

1. Если Вы будете копировать автоматически при старте или при обновлении, Вы НЕ забудете. (слово "забыть" мне не понятно применительно к программному продукту)
2. Грузите в рантайме, конфиги хоть в базе храните.
3. Ну, есть и извращения, когда в код компилятся левые пути, да еще и абсолютные. Тут большой простор для творчества, хотя желательно не оставлять его в релизах.

Код Вам пусть пишут другие, сорри.
...
Рейтинг: 0 / 0
24.11.2017, 14:37
    #39559052
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Можно наверное еще в каталоге/подкаталоге приложения сделать hard link на нужную assembly.


Jenyok2Смысл такой, что в папке C:\Work\Program1\ находится сторонняя программа с DLL1.dll, которая периодически обновляется, в том числе обновляется файл DLL1.dll .
Т.е. при каждом обновлении сторонней программы в паке C:\Work\Program1\ необходимо НЕ забывать обновить (скопировать) DLL1.dll в папку C:\Work\Program2\Bin\ с программой A1.exe . Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
Поэтому и вопрос как загрузить DLL1.dll из папки C:\Work\Program1\ программой A1.exe запущенной из папки C:\Work\Program2\Bin\ .
В таком режиме - грузить в коде Assembly в свой appDomain,потом выгружать
...
Рейтинг: 0 / 0
24.11.2017, 14:45
    #39559059
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
абсолютные пути в программе это зло и недопустимо.
Лучше использовать:
1.Переменные окружения
2. в .NET многие пути можно получить из кода, временную папку, рабочий стол, программные файлы, appdata и прочее, прочее прочее. Path.GetTempPath(); и другие
3. Текущий каталог: Environment.CurrentDirectory (вроде так)
Папку от куда запущена текущая сборка
...
Рейтинг: 0 / 0
24.11.2017, 18:48
    #39559224
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Arm79Можно наверное еще в каталоге/подкаталоге приложения сделать hard link на нужную assembly.


Jenyok2Смысл такой, что в папке C:\Work\Program1\ находится сторонняя программа с DLL1.dll, которая периодически обновляется, в том числе обновляется файл DLL1.dll .
Т.е. при каждом обновлении сторонней программы в паке C:\Work\Program1\ необходимо НЕ забывать обновить (скопировать) DLL1.dll в папку C:\Work\Program2\Bin\ с программой A1.exe . Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
Поэтому и вопрос как загрузить DLL1.dll из папки C:\Work\Program1\ программой A1.exe запущенной из папки C:\Work\Program2\Bin\ .
В таком режиме - грузить в коде Assembly в свой appDomain,потом выгружать

Как выгрузить ассембли из аппдомена?

зы.
You can not unload an assembly from an appdomain. You can destroy appdomains, but once an assembly is loaded into an appdomain, it's there for the life of the appdomain.
...
Рейтинг: 0 / 0
24.11.2017, 18:57
    #39559233
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Jenyok2Petro123Jenyok2,
Ты с расчётом на windows installer смотри.
Т.е. юзверь инсталлятором ставит либо расшаренную длл на несколько программ, либо только для одной.
Если для одной, то рядом с exe и кидай.
.
Условия задачи совсем другие.
Смысл такой, что в папке C:\Work\Program1\ находится сторонняя программа с DLL1.dll, которая периодически обновляется, в том числе обновляется файл DLL1.dll .
Т.е. при каждом обновлении сторонней программы в паке C:\Work\Program1\ необходимо НЕ забывать обновить (скопировать) DLL1.dll в папку C:\Work\Program2\Bin\ с программой A1.exe . Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
Поэтому и вопрос как загрузить DLL1.dll из папки C:\Work\Program1\ программой A1.exe запущенной из папки C:\Work\Program2\Bin\ .
.
Хотелось бы увидеть пример кода.
.
Жду Ваших ответов.

Напишите минимальное приложение, а лучше - сервис, в котором будет файл watcher, следящий за исходным фолдером, и если там обновится длл, он
1. пишет вам в почту сообщение
2. копирует длл в нужное место
3. по всей сети отправляет месседжи об обновлении длл
4. не дает работать на этом компьютере, навязчиво напоминая, мол, не забывай
...
...
Рейтинг: 0 / 0
24.11.2017, 19:14
    #39559241
Jenyok2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг ХупинJenyok2пропущено...

.
Условия задачи совсем другие.
Смысл такой, что в папке C:\Work\Program1\ находится сторонняя программа с DLL1.dll, которая периодически обновляется, в том числе обновляется файл DLL1.dll .
Т.е. при каждом обновлении сторонней программы в паке C:\Work\Program1\ необходимо НЕ забывать обновить (скопировать) DLL1.dll в папку C:\Work\Program2\Bin\ с программой A1.exe . Это НЕ всегда выполнимо, можно забыть про обновление DLL1.dll в папке C:\Work\Program2\Bin\ .
Поэтому и вопрос как загрузить DLL1.dll из папки C:\Work\Program1\ программой A1.exe запущенной из папки C:\Work\Program2\Bin\ .
.
Хотелось бы увидеть пример кода.
.
Жду Ваших ответов.

Напишите минимальное приложение, а лучше - сервис, в котором будет файл watcher, следящий за исходным фолдером, и если там обновится длл, он
1. пишет вам в почту сообщение
2. копирует длл в нужное место
3. по всей сети отправляет месседжи об обновлении длл
4. не дает работать на этом компьютере, навязчиво напоминая, мол, не забывай
...
.
Лишнее все это...
Писать лишнюю программу, забивать почту спамом, копировать файлы.
.
Уже есть готовая программа, которую надо подправить.
Задача простая, загрузить DLL из другой директории.
Возможно или нет ?
.
...
Рейтинг: 0 / 0
24.11.2017, 20:34
    #39559282
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг ХупинНапишите минимальное приложение, а лучше - сервис, в котором будет файл watcher, следящий за исходным фолдером, и если там обновится длл, он
1. пишет вам в почту сообщение
2. копирует длл в нужное место
3. по всей сети отправляет месседжи об обновлении длл
4. не дает работать на этом компьютере, навязчиво напоминая, мол, не забывай
...
выгрузить сборки из домена невозможно. точка.
можно создать другой AppDomain, загрузить сборки туда. Но это накладывает определенные ограничения на передачу данных между доменами.
...
Рейтинг: 0 / 0
25.11.2017, 04:18
    #39559332
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сказать приложению, где искать ассембли?
Ролг ХупинСон Веры Павловныпропущено...

Ну конфиг у этого приложения имеется? Если да - откорректируйте его вручную, и вручную создайте папки/скопируйте файлы. Если нет - тогда ой.

да, выше я описал, что сделал

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1278038&msg=20978682

Не верится, что нет решения через конфиг.
Берите fusion log viewer, ищите попытку загрузки вашей библиотеки, смотрите, почему не загрузилась. Есть подозрение, что в локальную папку выложена библиотека не той версии, либо эта библиотека тянет за собой какие-то зависимости, которых нет в локальной папке.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сказать приложению, где искать ассембли? / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]