Excluya los activos de tiempo de ejecución de las dependencias transitivas de .NET 6.
Estoy trabajando en un módulo de complemento para una aplicación .NET 6 y estaba siguiendo esta guía de Microsoft Docs, sin embargo, me encontré con un problema al cargar dinámicamente las bibliotecas de complementos.
Quiero lograr la siguiente estructura de proyecto:
SomeService.PluginBase
SomeService
depende deSomeService.PluginBase
SomeService.PluginSdk
depende deSomeService.PluginBase
SomePlugin
depende deSomeService.PluginSdk
Durante el inicio, SomeService
escanea las bibliotecas configuradas en busca de implementaciones de la interfaz IPlugin
del paquete SomeService.PluginBase
. SomeApi.PluginSdk
proporciona clases base para las implementaciones de complementos y referencia a la interfaz mencionada anteriormente de forma transitoria.
Según la guía, para evitar conflictos de ensamblado, necesito configurar lo siguiente en el archivo de proyecto de SomeService.Sdk
:
<itemgroup>
<projectreference include="..\SomeService.PluginBase\SomeService.PluginBase.csproj">
<private>false</private>
<excludeassets>runtime</excludeassets>
</projectreference>
</itemgroup>
Esto evita copiar la biblioteca al directorio de salida y funciona bien. Sin embargo, SomeService.PluginBase
todavía se copia al directorio de salida de SomePlugin
, ya que es una dependencia transitoria de SomeService.Sdk
. Aunque IPlugin
está en SomeService.PluginBase
, SomeService
no puede cargar el complemento debido a dos tipos diferentes de IPlugin
.
¿Existe alguna forma de evitar esto sin enumerar explícitamente SomeService.PluginBase
como un <projectreference>
de SomePlugin
?
davy.ai
Como experto en IT especializado en c#, .net-core, plugins, msbuild y dynamic-loading, la solución para evitar el problema de duplicidad de ensamblados es utilizando una técnica llamada “probing”. Esta técnica implica especificar directorios adicionales para buscar ensamblados en tiempo de ejecución. En este caso, podemos agregar una ruta de sondeo a la configuración de
SomeService
, lo que le permitirá encontrar el ensambladoSomeService.PluginBase
en el directorio de salida deSomePlugin
.Para hacer esto, podemos modificar el archivo de configuración de
SomeService
para incluir lo siguiente:Esto especifica que
SomeService
también debe buscar ensamblados en el directorioplugins\SomePlugin
en relación a su propio directorio. En este caso,SomePlugin
debe copiar el ensambladoSomeService.PluginBase
a su propio directorio de salida, bajo el directorioplugins\SomePlugin
.Con esta configuración,
SomeService
debería poder encontrar la implementación correcta deIPlugin
del ensambladoSomePlugin
, sin entrar en conflicto con la implementación deIPlugin
enSomeService.PluginBase
.