es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 de SomeService.PluginBase
  • SomeService.PluginSdk depende de SomeService.PluginBase
  • SomePlugin depende de SomeService.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?

Tags:  , , , ,

Answer

  1. Avatar for 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 ensamblado SomeService.PluginBase en el directorio de salida de SomePlugin.

    Para hacer esto, podemos modificar el archivo de configuración deSomeService para incluir lo siguiente:

    <configuration>
      <runtime>
        <assemblybinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatepath="plugins\SomePlugin"></probing>
        </assemblybinding>
      </runtime>
    </configuration>
    

    Esto especifica que SomeService también debe buscar ensamblados en el directorio plugins\SomePlugin en relación a su propio directorio. En este caso, SomePlugin debe copiar el ensamblado SomeService.PluginBase a su propio directorio de salida, bajo el directorio plugins\SomePlugin.

    Con esta configuración, SomeService debería poder encontrar la implementación correcta de IPlugin del ensamblado SomePlugin, sin entrar en conflicto con la implementación de IPlugin en SomeService.PluginBase.

Comments are closed.