Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

105
Vistas
Cargue las dependencias de NuGet en tiempo de ejecución

Estoy buscando una forma de ejecutar el código ejecutando los siguientes pasos:

  1. Recibir una lista de paquetes NuGet (una lista de tuplas ("nombre del paquete", "versión del paquete", "ruta a la clase principal").
  2. Recuperarlos en un directorio local (cf ejemplo de código n.º 1)
  3. Cargándolos en mi programa en tiempo de ejecución.
  4. Ejecución de las clases principales por introspección (cf ejemplo de código n.º 2)

Por ahora estoy luchando con el tercer paso. No puedo averiguar cómo cargar mi paquete en tiempo de ejecución.

Mi pregunta principal son:

  • ¿Cómo puedo saber en qué carpetas se almacenaron los paquetes recuperados?
  • ¿Cómo puedo cargar el contenido de esos directorios en mi programa?

Ejemplo de código n.º 1:

 private static void getPackageByNameAndVersion(string packageID, string version) { IPackageRepository repo = PackageRepositoryFactory.Default .CreateRepository("https://packages.nuget.org/api/v2"); string path = "C:/tmp_repo"; PackageManager packageManager = new PackageManager(repo, path); Console.WriteLine("before dl pkg"); packageManager.InstallPackage(packageID, SemanticVersion.Parse(version)); }

Ejemplo de código n.º 2:

 private static void loadByAssemblyNameAndTypeName(string assemblyName, string typeName) { AppDomain isolationAppDomain = AppDomain.CreateDomain("tmp"); object a = isolationAppDomain.CreateInstanceAndUnwrap(assemblyName, typeName); Type x = a.GetType(); MethodInfo m = x.GetMethod("Main"); m.Invoke(a, new object[] { }); }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Toma una taza de café :)

¿Descargando el paquete nuget?

Nuget.Core (paquete nuget) es una buena opción, y aquí hay un fragmento de código que tengo que debería poder descargar un paquete nuget por id y version

 var repo = PackageRepositoryFactory.Default .CreateRepository("https://packages.nuget.org/api/v2"); string path = "c:\\temp"; var packageManager = new PackageManager(repo, path); packageManager.PackageInstalled += PackageManager_PackageInstalled; var package = repo.FindPackage("packageName", SemanticVersion.Parse("1.0.0")); if (package != null) { packageManager.InstallPackage(package, false, true); }

Observe que conecté un controlador de eventos al evento PackageInstalled de la clase PackageManager .

¿Cómo cargamos un ensamblaje en un dominio de aplicación aislado?

Dado que la API de reflexión no proporciona una forma de cargar un ensamblaje en un dominio específico, crearemos una clase de proxy que actúe como un cargador en nuestro dominio aislado:

 public class TypeProxy : MarshalByRefObject { public Type LoadFromAssembly(string assemblyPath, string typeName) { try { var asm = Assembly.LoadFile(assemblyPath); return asm.GetType(typeName); } catch (Exception) { return null; } } }

Y ahora, ¿cómo ponerlo todo junto?

Aquí viene la parte compleja:

 private static void PackageManager_PackageInstalled(object sender, PackageOperationEventArgs e) { var files = e.FileSystem.GetFiles(e.InstallPath, "*.dll", true); foreach (var file in files) { try { AppDomain domain = AppDomain.CreateDomain("tmp"); Type typeProxyType = typeof(TypeProxy); var typeProxyInstance = (TypeProxy)domain.CreateInstanceAndUnwrap( typeProxyType.Assembly.FullName, typeProxyType.FullName); var type = typeProxyInstance.LoadFromAssembly(file, "<KnownTypeName>"); object instance = domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName); } catch (Exception ex) { Console.WriteLine("failed to load {0}", file); Console.WriteLine(ex.ToString()); } } }

Tenga en cuenta que este método es el controlador de eventos que se ejecuta después de descargar el paquete nuget

También

Tenga en cuenta que deberá reemplazar <KnownTypeName> con el nombre de tipo esperado que proviene del ensamblado (o tal vez ejecutar un descubrimiento de todos los tipos públicos en el ensamblado)


Vale la pena señalar que no he ejecutado este código yo mismo y no puedo garantizar que funcione de inmediato, y aún podría necesitar algunos ajustes. pero esperemos que sea el concepto el que te permita solucionar el problema.

over 4 years ago · Santiago Trujillo Denunciar

0

¡No hagas eso! Probablemente esté intentando cargar contenido de NuGet en la computadora de un cliente para ahorrar espacio en la distribución de su software. ¿No es eso?

El enfoque recomendado común es descargar el contenido de NuGet como segundo paso de una compilación automatizada (después de descargar el código fuente), compilar el software y ejecutar las pruebas automatizadas con el contenido de NuGet que ha descargado. Y luego distribuya la compilación con el contenido de NuGet que probó como la unidad completa compleja.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda