Что лучше для получения местоположения сборки, GetAssembly().Location или GetExecutingAssembly().Location

Пожалуйста, предложите, что является лучшим для получения места выполнения сборки.

Assembly.GetAssembly(typeof(NUnitTestProject.RGUnitTests)).Location

или же

Assembly.GetExecutingAssembly().Location 

Пожалуйста, предложите, что может быть лучше. Могу ли я использовать GetEntryAssembly() также?

2 ответа

Решение

Это зависит от того, что вы хотите.. Assembly.GetAssembly вернуть сборку где type объявлен Assembly.GetExecutingAssembly возвращает сборку, где current code выполняется на. а также Assembly.GetEntryAssembly вернуть process executableИмейте в виду, что это может быть не ваш исполняемый файл. например:

представьте, что ваш код включен myexecutable.exe и у вас есть этот сценарий.

trdparty.exe -> использует Assembly.LoadFile загрузить свой исполняемый файл и запустить некоторый код с помощью отражения

myexecutable.exe -> использует тип MyClass

но trdparty.exe исправляет ваш код, чтобы использовать новую версию MyClass находится в Patch.dll

Так что теперь.. если вы запустите приложение само по себе, вы получите этот результат

Assembly.GetAssembly(typeof(MyClass)) -> myexecutable.exe
Assembly.GetExecutingAssembly() -> myexecutable.exe
Assembly.GetEntryAssembly() -> myexecutable.exe

но если у вас есть предыдущий сценарий, вы получите

Assembly.GetAssembly(typeof(MyClass)) -> Patch.dll
Assembly.GetExecutingAssembly() -> myexecutable.exe
Assembly.GetEntryAssembly() -> trdparty.exe

поэтому в качестве ответа вы должны использовать тот, который дает желаемый результат.. ответ может показаться очевидным, что это Assembly.GetExecutingAssembly() но иногда нет.. представьте, что вы пытаетесь загрузить application.config файл, связанный с исполняемым файлом.. тогда путь, скорее всего, должен быть Assembly.GetEntryAssembly().Location чтобы всегда идти по пути "процесса"

как я уже сказал, зависит от сценария.. и цели...

Это кажется довольно очевидным: если вы хотите выполнить сборку, используйте GetExecutingAssembly,

Иногда у вас его нет, например при работе в качестве надстройки Office. Вы могли бы использовать Assembly.GetAssembly вместо.

Другие вопросы по тегам