Как я могу разрешить AssemblyName в путь к файлу сборки без загрузки этой сборки? - PullRequest
0 голосов
/ 31 марта 2019

Существует ли какой-либо общедоступный API в .NET Framework, .NET Core или .NET Standard, который может разрешить System.Reflection.AssemblyName в пути к файлу сборки, который будет загружен, без фактической загрузки эта сборка?

Лучшее, что у меня сейчас есть, это:

string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;

Но это все равно приводит к загрузке сборки (хотя только в контексте только для отражения).

(Предположим, что я не хочу менять способ, которым среда выполнения обнаруживает сборки. Я прошу это использовать в библиотеке, где я не свободен для проверки файлов конфигурации приложения, определения обработчика AppDomain.AssemblyResolve и т. Д. .)

1 Ответ

0 голосов
/ 01 апреля 2019

API-кандидатов в рамках:

  • AssemblyDependencyResolver в System.Runtime.Loader с методом string ResolveAssemblyToPath(AssemblyName assemblyName), который в настоящее время доступен только в .NET Core.

  • System.Reflection.MetadataLoadContext ( source на GitHub , package на nuget.org ), который, очевидно, сталкивается с точно такой же проблемой: возможность извлечь Assembly из AssemblyName, что, очевидно, требует загрузки первого откуда-либо.

    Создатели этой библиотеки извлекли эту проблему из внешнего мира, потребовав от программиста предоставить MetadataLoadContext с зависимостью MetadataAssemblyResolver, которая работает для него.

    Хотя эта библиотека поставляется с единственной конкретной реализацией (PathAssemblyResolver), она не обеспечивает реализацию, которая инкапсулирует алгоритм пробного разрешения / разрешения встроенной сборки во время выполнения.

Как другие библиотеки за пределами фреймворка работают с разрешением сборки?

Некоторые указатели для платформы

...