Как настроить загрузку моей dll, которая зависит от какой-либо третьей стороны dll env-variable? - PullRequest
0 голосов
/ 04 июля 2019

Например: у меня есть C: \ test \ foo.exe, для которого требуется мой bar.dll (который, в свою очередь, требует baz.dll, при условии, что baz.dll не является стандартным компонентом общего доступа Windows), тогда я размещаю оба бара.dll и baz.dll в C: \ test, и все работает.

Но я хочу, чтобы все было на своих местах, поэтому я хочу избежать процедуры копирования всех зависимых DLL в ту же папку, что и мой C: \ Test \ foo.exe.Например, я хочу установить некоторую переменную env, которая будет хранить путь к каталогу, где находится baz.dll, а затем использовать его для загрузки библиотек.

Возможно ли это?Как это можно сделать?Как вы справляетесь с такой ситуацией?

1 Ответ

0 голосов
/ 04 июля 2019

Это зависит от того, как ваше приложение связано. Я предполагаю, что, как и большинство современных приложений, вы создаете его с помощью манифеста сборки, который создает контекст загрузки. Если нет, то библиотеки DLL будут найдены в% PATH%, так что вы можете использовать это. Однако, если вы используете манифест, читайте дальше:

В большинстве случаев, чтобы найти DLL в произвольном месте, вам придется динамически загружать свои зависимости, используя LoadLibrary; см https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya

Более длинный ответ: нет встроенного способа сделать это. Это будет дыра в безопасности, потому что это позволит злоумышленнику заменить библиотеки DLL своими собственными. Но предполагая, что ваше приложение не имеет к этому отношения, вы можете использовать LoadLibrary для загрузки вашего bar.dll (находя его любым удобным вам способом); вам придется заменить все вызовы функций в этой DLL на указатели функций, которые вы решаете во время выполнения, используя GetProcAddress (https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress).

Теперь, что касается вторичной зависимости baz.dll, я думаю , если вы сначала загрузите ее с LoadLibrary, когда вы затем загрузите bar.dll, она разрешит свои зависимости от уже загруженной базы. .dll.

Если вы действительно хотите усложниться, вы можете обернуть зависимые DLL в сборку; сама сборка может указывать пути, я считаю. Но это становится довольно волосатым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...