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.

Importando DLLs Dependientes en un Script de PowerShell

Declaración del problema:

La forma óptima de importar DLL dependientes en un script de PowerShell.

Explicación:

Tengo una DLL, llamada a.dll, que tiene casi 10 dependencias en b.dll, c.dll,…. Cuando importo a.dll desde el paquete Nuget A en un script de PowerShell, dado que las DLL dependientes no se encuentran en el mismo directorio, se produce un error. Solo tengo las DLLs en los paquetes Nuget. Los paquetes, como es habitual, estarán en la siguiente estructura:


├── Nuget-A
│ ├── 1.0
| | |── a.dll

├── Nuget-B
│ ├── 2.0
| | |── b.dll

En el script de PowerShell importaré a.dll de la siguiente manera:

Import-Module “Nuget-A/1.0/a.dll”

Esto me produce un error, por lo que hago lo siguiente:

Import-Module “Nuget-B/2.0/b.dll”
Import-Module “Nuget-A/1.0/a.dll”

De la misma manera, tengo que hacerlo para las 10 DLLs.

¿Cuál es la forma óptima de manejar este escenario? También estoy abierto a otras enfoques alternativos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Hay varias formas de manejar este escenario:

    1. Usando un archivo de configuración: Puede crear un archivo de configuración (por ejemplo, config.json) en el mismo directorio que su script de PowerShell, que almacena las rutas de acceso a todas las DLL dependientes. Luego, su script de PowerShell puede leer este archivo e importar las DLL según sea necesario. De esta manera, solo necesita actualizar el archivo de configuración cuando cambien las rutas de acceso de las DLL. Aquí hay un ejemplo de cómo podría ser el archivo de configuración:
    {
      "Nuget-A/1.0/a.dll": [
        "Nuget-B/2.0/b.dll",
        "Nuget-C/3.0/c.dll",
        ...
      ]
    }
    

    Y aquí hay un ejemplo de cómo podría leer este archivo de configuración en PowerShell:

    $config = Get-Content "./config.json" | ConvertFrom-Json
    
    foreach ($dependentDll in $config.'Nuget-A/1.0/a.dll') {
        Add-Type -Path $dependentDll
    }
    
    Import-Module "Nuget-A/1.0/a.dll"
    
    1. Usando un repositorio local de NuGet: Puede crear un repositorio local de NuGet en su máquina y agregar todos los paquetes de NuGet que contengan las DLL dependientes a este repositorio. De esta manera, puede administrar y actualizar fácilmente estas dependencias según sea necesario. Aquí hay un ejemplo de cómo podría configurar un repositorio local de NuGet usando la CLI de NuGet:
    nuget.exe sources Add -Name "Local" -Source "C:\Ruta\Al\Repositorio\Local\NuGet"
    

    Y aquí hay un ejemplo de cómo podría instalar un paquete en este repositorio:

    nuget.exe install Nuget-B -Version 2.0 -OutputDirectory "C:\Ruta\Al\Repositorio\Local\NuGet"
    

    Con esta configuración, puede importar fácilmente las DLL dependientes en su script de PowerShell de la siguiente manera:

    Install-Package Nuget-A -Version 1.0 -Source "C:\Ruta\Al\Repositorio\Local\NuGet" -Destination ".\paquetes"
    Import-Module ".\paquetes\Nuget-A.1.0\lib\netstandard2.0\a.dll"
    
    1. Utilizando el Global Assembly Cache (GAC): Otra opción es agregar las DLL dependientes al Global Assembly Cache (GAC) en su máquina. Esto requiere privilegios de administrador y puede que no sea adecuado para todos los escenarios. Aquí hay un ejemplo de cómo podría agregar una DLL al GAC:
    [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
    
    $publish = New-Object System.EnterpriseServices.Internal.Publish
    $path = "C:\Ruta\Al\Archivo\DLL\Dependiente.dll"
    
    $publish.GacInstall($path)
    

    Con las DLL dependientes agregadas al GAC, puede importarlas fácilmente en su script de PowerShell de la siguiente manera:

    [System.Reflection.Assembly]::Load("a, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
    

    En general, el enfoque más adecuado depende de su escenario y requisitos específicos. Considere factores como la facilidad de administración, la seguridad y la escalabilidad al elegir un enfoque.

Comments are closed.