2017-01-19 5 views
3

Скажем, у меня есть приложение: C: \ MyPrograms \ App.exeПолучить расположение динамически загружаемой сборки

Это приложение не ссылается Library.dll. App.exe может динамически загружать сборки.

И давайте говорить о том, что путь к DLL является C: \ MyPrograms \ библиотека DLL \ Library.dll

Я могу получить путь исполняющей сборки (App.exe), независимо от того, что я не попробую ,

GetExecutingAssembly()

GetEntryAssembly()

AppDomain.CurrentDomain.BaseDirectory

Есть ли способ, чтобы получить местоположение DLL, который динамически загружается? Все просто возвращает, для примера, расположение App.exe

EDIT 1: Перефразируя OP ...

MyApp.exe может вызвать любой DLL, через проходя путь к DLL. Эта DLL может быть где угодно, когда пользователь ее удаляет. Выпуск жестко-кодирующих путей или что-то в этом роде.

Что я хотел бы сделать, так это получить текущее местоположение динамически загружаемой библиотеки DLL. т.е. для обработки ошибок, я хотел бы иметь возможность записывать журнал ошибок в тот же каталог, в котором находится DLL.

Я нашел и попробовал несколько способов получить место, где находится загруженная DLL, однако это либо возвращает каталог сборки CALLING (MyApp.exe) или вообще ничего.

+0

может получить или cannnot получить путь ?? –

+0

Похоже, вы хотите обрабатывать ['AssemblyResolve'] (https://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve (v = vs.110) .aspx) событие ... –

+0

Допустим, вы регистрируете ошибки, как вы обнаруживаете, из какой DLL возникла ошибка? Можете ли вы написать пример кода, как он будет работать в вашем вопросе, для строки, где вам понадобится путь, просто введите «var path = MagicFunctionThatGetsPath (sourceDll)», я хочу знать, как вы вычисляете «sourceDll» и каков тип этого объекта. –

ответ

3

System.Reflection.Assembly класс имеет свойство Location, которое получает путь или UNC-адрес загруженного файла, который содержит манифест. Так, если, например, вы загружаете сборки таким образом

var assembly = System.Reflection.Assembly.Load(@"<assembly name>"); 

assembly.Location вернет то, что вы спрашиваете.

Ответ Редактирование 1: Для того, чтобы сделать это

для обработки ошибок, я хотел бы, чтобы иметь возможность написать журнал ошибок в же каталог DLL находится в

вы можете

  1. Load an assembly to app domain и подписаться на AppDomain.UnhandledException, где вы можете поместить журнал ошибок ging код. Этот код будет знать текущий домен и его базовый каталог.
  2. Передайте какой-то контекст в пути сборки при вызове методов сборки и используйте его в логике ведения журнала. Это может быть контекст нити, если вы вызываете методы сборки только в одном потоке.
+0

Путь DLL неизвестен (естественно, я знаю, где я это РЕАЛЬНО). Однако вызывающее приложение предназначено для принятия пути к DLL, пользователь может разместить DLL в любом месте. У меня также нет источника для вызывающего приложения. assembly.Location ничего не возвращает, когда я пытаюсь использовать его в DLL, который будет динамически вызван – CleverNameHere

+0

В вопросе мы имеем возможность «динамически загружать сборки». Есть несколько способов, как это сделать: https://msdn.microsoft.com/en-us/library/25y1ya39(v=vs.110).aspx. Но в любом случае приложение должно иметь ссылку на загруженный экземпляр сборки. Или, может быть, «может динамически загружать сборки» означает что-то еще? –

+0

У вызывающего приложения есть какая-то ссылка. Проблема в том, что независимо от того, что я пробовал до сих пор, я могу получить только каталог вызывающего приложения. Я хотел бы найти способ из динамически загружаемой DLL получить каталог, в котором он сейчас находится, поэтому я могу делать такие вещи, как запись журнала на одно и то же место или поиск конфигурационных файлов. Независимо от того, где DLL будет размещаться в Windows, я ищу способ получить его текущее местоположение. Например, когда он загружен, сохраните текущий каталог в строке или что-то еще. – CleverNameHere

0

Если вы находитесь внутри самой динамически загружаемой сборки, где вы определили класс под названием MyDynLoadObject вы можете сделать это:

Assembly assem = Assembly.GetAssembly(typeof(MyDynLoadObject)); 

Edit: Еще один путь:

public class MyDynLoadObject 
{ 
    public MyDynLoadObject() 
    { 

     Assembly assem = this.GetType().Assembly; 

    } 
} 
+0

Свойство объекта assem.Location ничего не возвращает. И я помещаю код, чтобы получить его внутри DLL, который должен быть динамически вызван. – CleverNameHere

+0

@CleverNameHere: Strange - он работает для меня. См. Мое редактирование. –