none
Cargar dll de C++ nativo. RRS feed

  • Pregunta

  • Buenas:

    Quiero adaptar este código de C# que si funciona al lenguaje F#. A pesar que lo explica aquí, no lo capto.

    Por ahora he hecho esto en F#.

    open System
    open System.Runtime.InteropServices
    
    module Program = let [<EntryPoint>] main _ = 0
    
    module InteropWithNative = let
        [DllImport("Super_dll.dll")]
        extern static public int Suma(int a, int b)
    
        [DllImport("Super_dll.dll")]
        extern static public IntPtr Mensaje()
    
        // Título de la ventana.
        Console.Title <- "Consola F# 2019";
    
        // Tamaño de la ventana.
        Console.SetWindowSize(40, 5)
    
        // Color de las letras.
        Console.ForegroundColor <- ConsoleColor.Blue
    
        Console.WriteLine(Marshal.PtrToStringAuto(SUPER_DLL.Mensaje()))
        Console.WriteLine(SUPER_DLL.Suma(1764, -764).ToString())
    
        // Pulse cualquier tecla para salir.
        Console.ReadKey()

    El código completo en C# que si funciona.

    using System;
    using System.Runtime.InteropServices;
    
    namespace Consola_cs
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Título de la ventana.
                Console.Title = "Consola C# 2019";
    
                // Tamaño de la ventana.
                Console.SetWindowSize(40, 5);
    
                // Color de las letras.
                Console.ForegroundColor = ConsoleColor.Green;
    
                Console.WriteLine(Marshal.PtrToStringAuto(SUPER_DLL.Mensaje()));
                Console.WriteLine(SUPER_DLL.Suma(1764, -764).ToString());
    
                // Pulse cualquier tecla para salir.
                Console.ReadKey();
            }
            internal class SUPER_DLL
            {
                [DllImport("Super_dll.dll")]
                extern static public int Suma(int a, int b);
                [DllImport("Super_dll.dll")]
                extern static public IntPtr Mensaje();
            }
        }
    }

    Gracias.


    http://electronica-pic.blogspot.com


    • Editado Metaconta jueves, 18 de junio de 2020 10:03
    jueves, 18 de junio de 2020 9:43

Todas las respuestas

  • Bueno, yo no sé F#, pero veo una cosa rara: en el programa en F# estás llamando a SUPER_DLL.NombreDeMetodo. Pero en el programa en F# no tienes nada que se llame SUPER_DLL.

    En el programa en C# ese es el nombre de la clase que contiene las declaraciones, y dado que son métodos estáticos puedes llamarlos anteponiéndoles el nombre de la clase que los contiene. Pero en F# no están contenidos dentro de ninguna clase. ¿Por qué los estás llamando con el nombre de la clase que usas en C#?

    Nota: Aunque la DLL se llama Super_dll, esto no guarda ninguna relación con el nombre SUPER_DLL que tiene la clase. La clase se podría llamar de cualquier otra forma, su nombre no está vinculado con el nombre de la dll a la que estás llamando desde esa clase.

    jueves, 18 de junio de 2020 17:45
  • Cierto. Me equivoqué.

    open System
    open System.Runtime.InteropServices
    
    module Program = 
    // Importar dll.
      [<DllImport("Super_dll.dll")>]
      extern int Suma(int a, int b)
    
      [<DllImport("Super_dll.dll")>]
      extern IntPtr Mensaje()
    
      let [<EntryPoint>] main _ =
        // Título de la ventana.
        Console.Title <- "Consola F# 2019";
    
        // Tamaño de la ventana.
        Console.SetWindowSize(40, 5)
    
        // Color de las letras.
        Console.ForegroundColor <- ConsoleColor.DarkCyan
    
        // Llamar a funciones hacia la dll.
        Console.WriteLine(Marshal.PtrToStringAuto(Mensaje()))
        Console.WriteLine(Suma(1764, -764))
    
        // Pulse cualquier tecla para salir.
        Console.ReadKey() |> ignore
    
        // Return. Retorna un valor.
        0

    Me sale un error.


    http://electronica-pic.blogspot.com


    • Editado Metaconta jueves, 18 de junio de 2020 22:57
    jueves, 18 de junio de 2020 20:31