I have a config file that I need to load as part of the execution of a dll I am writing.
The problem I am having is that the place I put the dll and config file is not the «current location» when the app is running.
For example, I put the dll and xml file here:
D:Program FilesMicrosoft Team Foundation Server 2010Application TierWeb ServicesbinPlugins
But if I try to reference the xml file (in my dll) like this:
XDocument doc = XDocument.Load(@".AggregatorItems.xml")
then .AggregatorItems.xml translates to:
C:windowssystem32inetsrvAggregatorItems.xml
So, I need to find a way (I hope) of knowing where the dll that is currently executing is located. Basically I am looking for this:
XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"AggregatorItems.xml")
asked Jan 21, 2011 at 22:52
You are looking for System.Reflection.Assembly.GetExecutingAssembly()
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");
Note:
The .Location property returns the location of the currently running DLL file.
Under some conditions the DLL is shadow copied before execution, and the .Location property will return the path of the copy. If you want the path of the original DLL, use the Assembly.GetExecutingAssembly().CodeBase property instead.
.CodeBase contains a prefix (file:), which you may need to remove.
SSS
4,6941 gold badge23 silver badges44 bronze badges
answered Jan 21, 2011 at 22:55
BrokenGlassBrokenGlass
158k28 gold badges284 silver badges334 bronze badges
7
Reflection is your friend, as has been pointed out. But you need to use the correct method;
Assembly.GetEntryAssembly() //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly() // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t ) // gives you the assembly in which the specified type is defined.
answered Jan 21, 2011 at 23:06
Nicholas CareyNicholas Carey
70.6k16 gold badges93 silver badges135 bronze badges
0
In my case (dealing with my assemblies loaded [as file] into Outlook):
typeof(OneOfMyTypes).Assembly.CodeBase
Note the use of CodeBase (not Location) on the Assembly. Others have pointed out alternative methods of locating the assembly.
answered Jan 21, 2011 at 23:07
System.Reflection.Assembly.GetExecutingAssembly().Location
bluish
26k27 gold badges120 silver badges179 bronze badges
answered Jan 21, 2011 at 22:56
HawxbyHawxby
2,74621 silver badges29 bronze badges
If you’re working with an asp.net application and you want to locate assemblies when using the debugger, they are usually put into some temp directory. I wrote the this method to help with that scenario.
private string[] GetAssembly(string[] assemblyNames)
{
string [] locations = new string[assemblyNames.Length];
for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)
{
locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
}
return locations;
}
For more details see this blog post http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/
If you can’t change the source code, or redeploy, but you can examine the running processes on the computer use Process Explorer. I written a detailed description here.
It will list all executing dlls on the system, you may need to determine the process id of your running application, but that is usually not too difficult.
I’ve written a full description of how do this for a dll inside IIS — http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/
answered May 2, 2015 at 17:18
BryanBryan
4,98710 gold badges50 silver badges68 bronze badges
Try this
System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath)
answered Jul 29, 2022 at 9:15
|
Заблокирован |
|
|
1 |
|
|
02.12.2014, 20:19. Показов 5165. Ответов 5
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке c:/test/dll/.
0 |
|
73 / 69 / 38 Регистрация: 09.10.2012 Сообщений: 238 |
|
|
02.12.2014, 20:47 |
2 |
|
GetModuleFileName не подойдет? Не знаю, можно ли её из самой dll вызывать.
2 |
|
Ушел с форума 16458 / 7422 / 1186 Регистрация: 02.05.2013 Сообщений: 11,617 Записей в блоге: 1 |
|
|
02.12.2014, 20:49 |
3 |
|
В точку входа dll (DllMain) приходит ее HMODULE, далее
2 |
|
Заблокирован |
|
|
02.12.2014, 21:16 [ТС] |
4 |
|
GetModuleFileName Э… не подойдёт, пишу на Qt, нужно либо кроссовое решение, либо решение по стандарту С++.
0 |
|
73 / 69 / 38 Регистрация: 09.10.2012 Сообщений: 238 |
|
|
02.12.2014, 21:20 |
5 |
|
нужно либо кроссовое решение Под windows уже есть решение)
0 |
|
Заблокирован |
|
|
02.12.2014, 21:48 [ТС] |
6 |
|
Под windows уже есть решение) А на Qt что — то есть подобное? Там QLibrary используется для загрузки библиотек.
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
02.12.2014, 21:48 |
|
6 |
Опубликовано 28.09.2022
Содержание:
- 1 Библиотека DLL Windows
- 2 Как найти и установить библиотеку DLL
- 2.1 Регистрация dll-файла через командную строку
- 3 Как установить библиотеку DLL сторонними инструментами
- 3.1 DLL Helper
- 3.2 Advanced PC Cleanup
- 3.3 CCleaner
- 3.4 Advanced System Optimizer
- 4 Точка входа не найдена в библиотеке dll
- 5 Заключение
Библиотека DLL Windows
Файлы библиотек DLL использует почти все программное обеспечение, установленное на компьютере. Пользователь не замечает наличие этих элементов, пока все работает нормально. Их отсутствие становится ярко заметно, когда система сообщает об ошибке DLL. Она возникает из-за того, что нужный компонент отсутствует, устарел или поврежден. Для полноценного функционирования программ в библиотеке должны быть все нужные файлы, причем подписанные цифровой подписью, актуальные и корректно работающие.
Решить проблему с отсутствием dll достаточно просто — необходимо скачать подходящую библиотеку, разместить ее в правильной папке и зарегистрировать в Windows. Рассмотрим алгоритм действий.
Как найти и установить библиотеку DLL
Инсталляция и регистрация библиотеки производится согласно единому алгоритму вне зависимости от версии операционной системы. Перед скачиванием файлов необходимо определить разрядность Windows. Кликаем в Проводнике на «Этот компьютер» и выбираем «Свойства». К примеру, на скриншоте 64-разрядная Windows 10 Pro.
Скачиваем подходящие файлы, а затем перемещаем их в корневую папку. Для 32-разрядной ОС (x32) это директория C:WindowsSystem32, для 64-разрядной (x64) — C:Windows SysWOW64. Теперь библиотеки необходимо зарегистрировать в ОС. Используем для этого win+r, и в открывшейся строке введем regsvr32 имяфайла.dll.
Команда regsvr32 зарегистрирует элемент библиотеки имяфайла.dll. Подтверждаем OK, перезагружаем компьютер и продолжаем работу. Ошибка должна исчезнуть.
Регистрация dll-файла через командную строку
Запускаем командную консоль с админскими правами. Вводим regsvr32.exe C:/Windows/System32/имяфайла.dll и кликаем «Энтер».
Обязательно делаем перезагрузку компьютера.
Если после этого система сообщает, что не удается загрузить модуль, проверьте, правильно ли прописан путь к файлу, и лежит ли он в упомянутой выше корневой папке. Также dll-элемент может быть уже ранее зарегистрирован. Скачанные файлы сохраняйте в отдельной папке, возможно, они еще пригодятся. Используйте только актуальные библиотеки.
Если вдруг приложение либо игра не видит элемент dll, необходимо скопировать последний и вставить в директорию, где находится основной исполняемый exe-файл. После этого заново запускаем программу.
Как установить библиотеку DLL сторонними инструментами
Установить и зарегистрировать системные DLL возможно с помощью различных приложений, о которых речь пойдет ниже. Они способны автоматически найти недостающие библиотеки, проанализировать состояние ОС, проверить целостность реестра и создать резервные копии. При этом компоненты, связанные с .NET Framework, Visual C++ и DirectX, нужно скачивать с официальных сайтов, а конкретные ошибки в отдельных программах лучше решать с разработчиками проблемного ПО.
DLL Helper
DLL Helper — платный софт на русском языке. Обладает простым понятным интерфейсом и внушительным онлайн-хранилищем DLL-библиотек. Легко устанавливается. Для поиска нужных элементов достаточно знать их официальные наименования, данные им производителем. Программа работает в двух режимах: «Простой» (предлагает только актуальные версии) и «Продвинутый» (предлагает все доступные версии). Существует возможность отката ранее установленных DLL.
Advanced PC Cleanup
Advanced PC Cleanup позволяет удалить временные элементы, зарегистрировать недостающие dll-файлы, исправить другие проблемы. Программа быстро обнаруживает отсутствующие библиотеки и предлагает исправить записи в реестре, отображая весь перечень проблемных файлов, откуда пользователь может сам выбрать компоненты для восстановления. ПО работает на английском языке, в бесплатном варианте и премиум-версии.
CCleaner
CCleaner проверяет наличие в системе элементов, способных снизить ее быстродействие. Обладает простым интерфейсом и позволяет во вкладках одного окна совершить множество действий по оптимизации работы компьютера. Программа сканирует реестр и среди других ошибок обнаруживает недостающие либо поврежденные записи о библиотеках. Поскольку CCleaner обладает обширным инструментарием, а не занимается исключительно dll-файлами, то проблемы с этими элементами не всегда удается успешно разрешить. Утилита работает на русском языке, обладает пробной и премиум-версией.
Advanced System Optimizer
Advanced System Optimizer выполняет те же функции, что и CCleaner. Запустив проверку реестра, пользователь получает перечень поврежденных файлов, среди которых есть и недостающие либо незарегистрированные dll-библиотеки. Можно сразу провести восстановление и избавиться от возникших проблем. Работает на русском языке и в бесплатном функционале позволяет выполнить поиск и исправление dll.
Есть и такие программы, как SpeedyPC Pro, SS Registry Fixer и т. д. Работают на русском и английском языках, являются бесплатными и условно-бесплатными, специализированными и общими утилитами. В последних главное — наличие функции исправления ошибок реестра, которая поможет найти и восстановить dll-библиотеки.
Точка входа не найдена в библиотеке dll
Иногда во время запуска программы либо игры компьютер выдает ошибку «Точка входа в процедуру не найдена в библиотеке DLL». Это означает, что нужный dll-файл не найден, поврежден или содержит ошибку в синтаксисе. Windows способна автоматически заменить отсутствующие или поврежденные системные элементы. Во всех остальных случаях решить проблему помогут нижеприведенные рекомендации.
- Скачайте и установите актуальную версию Visual C++ с официального сайта Microsoft. Запустите на своем компьютере обе вариации — и для 32-, и для 64-битной ОС.
- В командной строке с админскими правами используйте sfc /scannow. После ввода команды нажмите «Энтер». По окончании проверки системных файлов утилита сообщит о файлах, которые удалось либо не удалось восстановить.
- Возможно, ситуацию исправит переустановка проблемного софта.
- Перерегистрируйте dll-файл, открыв командную строку с админскими правами и используя команды «regsvr32/u a имяфайла.dll» и «regsvr32 a имя файла.dll» (без кавычек). После каждой команды щелкните «Энтер».
- Откатите операционную систему назад с помощью win+r и команды rstrui.exe. Кликните OK, выберите нужную точку восстановления и запустите процесс. После перезагрузки система будет работать по состоянию на указанную дату.
Продвинутым пользователям, самостоятельно устанавливающим Windows, можно рекомендовать инструмент Media Creation Tool. Он решит ошибку, когда система сообщит, что точка процедуры не найдена в библиотеке dll. С помощью этой утилиты необходимо создать загрузочный образ «Виндовс» на сайте Microsoft и произвести инсталляцию ОС с установочной флешки. Этот способ поможет извлечь и применить недостающие dll-файлы.
Заключение
Если, несмотря на предложенные инструкции, вам не удалось найти и зарегистрировать недостающие или поврежденные dll-библиотеки, обратитесь к сотрудникам «АйТиСпектр». Специалисты наладят работу операционной системы, а заодно помогут решить проблемы с работой других компонентов компьютера.
Файл DLL – компонент динамически подключаемой библиотеки, чьи элементы используют практически все программы. Библиотека DLL файлов расположена в корневой папке системы. Компоненты должны быть все в наличии, иметь цифровую подпись, правильно работать и быть актуальными по версии. Если одно из требований не соблюдено, при запуске программы пользователь получит информационное уведомление: ошибка DLL. Неисправность свидетельствует о том, что отсутствует DLL файл, поврежден или устарел.
Как установить DLL файл
Чтобы программы, приложения и игры снова начали работать, необходимо установить вручную недостающие компоненты библиотеки. Просто поместить файл в папку недостаточно ─ нужно знать как их зарегистрировать.
Помещение и регистрация файлов библиотеки
Перед тем как установить DLL файл на Windows 7,8,10, их нужно скачать, причем точно под разрядность системы.
Давайте определим, какая разрядность у Вашей системы (если вы точно знаете, может пропустить этот шаг)
Шаг 1. Кликаем правой кнопкой мыши по «Мой компьютер» и выбираем «Свойства»
Шаг 2. В открывшемся окне, мы может прочитать свойства компьютера, версию операционной системы и её разрядность 32 (х86) или 64 бит. В нашем случаи стоит 64-разрядная операционная система Windows 10.
·
Шаг 3. После скачивания файлов их нужно поместить в корневую папку, зарегистрировать
для х32 (х86) систем компонент необходимо заменить или поместить в папку C:WindowsSystem32;
для х64 необходимо выполнить замену или переместить в папку C:Windows SysWOW64;
Шаг 4. Файл нужно зарегистрировать в системе.
Сделать это можно, открыв командную строку комбинацией «Win» + «R», или нажать «Пуск» и «Выполнить»;
в открывшемся окне ввести через пробел следующее: regsvr32 имя файла.dll – где, «regsvr32» ─ команда для регистрации, а «имя файла.dll» – полное имя вставленного компонента;
или же можно прописать расположение файла вручную — regsvr32.exe + путь к файлу
Шаг 5. Нажмите «ОК», и перезагрузите компьютер, и новые параметры вступят в силу.
Сразу хочется отметить, что при регистрации возможны появления ошибок. Например: «Не удалось загрузить модуль». Обычно они возникают по 3 причинам
- Не правильно прописан путь к файлу, или файл не был перемещен в каталог System32 или SysWOW64
- Не все файлы DLL вообще нуждаются в регистрации, иногда достаточно просто скопировать их в каталок System32 или SysWOW64 или поместить в корень проблемной игры или программы
- Файлы уже были зарегистрированы ранее
Второй способ регистрации
Шаг 1. Зарегистрировать файл можно с помощью командой строки, которую нужно запустить от имени администратора.
Шаг 2. Пишем команду regsvr32.exe + путь к файлу и жмём «Enter»
Шаг 3. Появится сообщение что «Всё прошло удачно», и просто перезагружаем компьютер
Вот и всё, файл зарегистрирован, можете пробовать запускать вашу игру или программу
А вот, некоторые советы, которые могут вам пригодиться.
- Помещайте элементы только в указанную папку (возможно, она будет скрыта по умолчанию). Вам нужно убрать галочку «Не показывать скрытые папки» в настройках отображения.
- Если при замене файла требуется разрешение администратора – подтвердите действие.
- Выбирайте только актуальные файлы на момент загрузки и сохраните их себе в компьютер отдельно. Вам они могут еще пригодиться. В случае если проблема образуется вновь, вы быстро восстановите работоспособность системы.
We create a DLL for other applications to load and use some of the functionality in the application. The DLL has dependency on the the actual path where it is loaded from.
<product_home>/bin/<DLL is here>
|
|----/configdir/configfile
|----/lib/<java jarfiles>
It needs the product_home location to read config files and load jar files etc
My windows application proloads a special DLL. I need to find actual path to a loaded DLL with in the process and use it to set a «HOME» variable. This will be used in rest of the processing. Using an externally set environment variable some time fails when there are multiple versions of dll present on the machine. To me it looks like DLL can figure out its own «product_home» as long it can get the actual loaded location.
The DLL This article Get Your DLL’s Path/Name provides one such way- (yet to try it successfully. The generated exe crashes). Is this the correct approach?
asked Jul 15, 2011 at 10:14
JayanJayan
17.9k15 gold badges88 silver badges140 bronze badges
Either I don’t understand your need, or the link you mention is not what you need. If I understand you correctly, you’d like to get the full path of a certain DLL loaded by the process. So, say that DLL is «kernel32.dll», you’d like to get «c:windowssystem32kernel32.dll». Please correct me if I’m wrong.
If that’s what you want, the easiest way to do that would be:
HMODULE hModule = GetModuleHandle(_T("kernel32.dll"));
TCHAR dllPath[_MAX_PATH];
GetModuleFileName(hModule, dllPath, _MAX_PATH);
Failures checks omitted for brevity — read more about GetModuleHandle and GetModuleFileName.
answered Jul 15, 2011 at 12:06
EranEran
21.6k5 gold badges56 silver badges89 bronze badges
3











