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.

Crear dinámicamente un archivo dll a partir de una cadena o archivo cs

La tarea consiste en que el contenido del archivo dll solo se conozca durante la ejecución del programa principal, en el cual obtengo los datos necesarios y formo una línea o archivo cs. Luego, necesito crear un archivo dll a partir del código que escribí en la línea (supongamos que es correcto y se compila sin errores). Después, conectaré dinámicamente esta dll al programa principal y utilizaré la función desde allí.

El problema principal radica en la creación dinámica del archivo dll, no encontré una opción que funcione. Estoy trabajando en WPF .NET 5.0, intenté CodeDOM pero obtuve el error “no compatible con esta versión”, así que agradeceré cualquier información sobre cómo hacerlo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Creación dinámica de un archivo DLL en WPF .NET 5.0

    Como experto en TI especializado en c#, .net, wpf, dll, .net-5, recomiendo la siguiente solución para crear dinámicamente un archivo DLL en WPF .NET 5.0.

    Solución

    Para crear dinámicamente un archivo DLL en WPF .NET 5.0, recomiendo utilizar la plataforma de compilador Roslyn integrada en .NET.

    Aquí están los pasos:

    1. Obtén el código que escribiste en la línea y guárdalo en un archivo con extensión .cs.
    2. Usa la plataforma de compilador Roslyn para compilar el código en un archivo de DLL.

      Aquí tienes un código de ejemplo que puedes usar:

      using Microsoft.CodeAnalysis;
      using Microsoft.CodeAnalysis.CSharp;
      
      var syntaxTree = CSharpSyntaxTree.ParseText(code);
      var assemblyName = Path.GetRandomFileName();
      var references = new MetadataReference[]
      {
         MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
      };
      
      var compilation = CSharpCompilation.Create(assemblyName)
         .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
         .AddReferences(references)
         .AddSyntaxTrees(syntaxTree);
      
      using (var stream = new MemoryStream())
      {
         var result = compilation.Emit(stream);
         if (result.Success)
         {
             stream.Seek(0, SeekOrigin.Begin);
             var assembly = Assembly.Load(stream.ToArray());
             return assembly;
         }
         else
         {
             throw new Exception("No se pudo compilar el código en un ensamblado.");
         }
      }
      

      Este código compila la variable de código (que contiene tu código C#) en una biblioteca de vínculo dinámico (DLL) con un nombre de archivo aleatorio.

    3. Luego, puedes cargar dinámicamente el ensamblado compilado en tu programa principal utilizando el método Assembly.Load, de la siguiente manera:

      var assembly = CompileAndLoadAssembly(code);
      dynamic instance = Activator.CreateInstance(assembly.GetType("MiClase"));
      instance.MiMetodo();
      

      Aquí, CompileAndLoadAssembly es un método que compila el código en un ensamblado utilizando el código de ejemplo anterior. Puedes usar la palabra clave dynamic para acceder a los métodos y propiedades del ensamblado cargado.

    Conclusión

    Con la ayuda de la plataforma de compilador Roslyn, puedes compilar y cargar un archivo DLL creado dinámicamente en tu aplicación WPF .NET 5.0. Espero que esto te ayude a resolver tu problema.

Comments are closed.