Что лучше для получения местоположения сборки, 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
вместо.