Visual C++ .NET - Leer dll c++ nativo con interfaz C++ CLR

 
Vista:
sin imagen de perfil
Val: 4
Ha disminuido su posición en 7 puestos en Visual C++ .NET (en relación al último mes)
Gráfica de Visual C++ .NET

Leer dll c++ nativo con interfaz C++ CLR

Publicado por Meta (7 intervenciones) el 18/06/2020 12:38:03
Buenas:

Tengo un ejemplo en C# en el cual me lee una dll hecho en C++ nativo. Quiero con el C++ CLR o .net que haga de intergaz y me funcione, pero no se corregir los errores.

Dejo el ejemplo completo y funciona en el lenguaje C#. Quiero adaptar el C# a C++ CLR o .net.

Código C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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();
        }
    }
}

Código con errores y quiero corregirlo en C++ CLR o .net:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "pch.h"
#include <OAIdl.h>
 
using namespace System;
 
int main(array<System::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::Yellow;
 
    Console::WriteLine(Marshal->PtrToStringAuto(SUPER_DLL::Mensaje()));
    Console::WriteLine(SUPER_DLL::Suma(1764, -764)::ToString());
 
    // Pulse cualquier tecla para salir.
    Console::ReadKey();
    return 0;
}
 
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();
}

¿Alguna idea?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Consumir DLL de C++ nativo en C++/CLI o .NET

Publicado por Alejandro (265 intervenciones) el 14/02/2024 23:48:05
Meta, parece que estás intentando utilizar C++/CLI o .NET para consumir una DLL de C++ nativo. Aquí hay una versión corregida del código en C++/CLI para que funcione correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "stdafx.h"
#include <Windows.h>
 
using namespace System;
using namespace System::Runtime::InteropServices;
 
public ref class SUPER_DLL
{
public:
    [DllImport("Super_dll.dll", CallingConvention = CallingConvention::Cdecl)]
    static int Suma(int a, int b);
 
    [DllImport("Super_dll.dll", CallingConvention = CallingConvention::Cdecl)]
    static IntPtr Mensaje();
};
 
int main(array<System::String ^> ^args)
{
    // Título de la ventana.
    Console::Title = "Consola C++/CLI 2019";
 
    // Tamaño de la ventana.
    Console::SetWindowSize(40, 5);
 
    // Color de las letras.
    Console::ForegroundColor = ConsoleColor::Yellow;
 
    Console::WriteLine(Marshal::PtrToStringAnsi(SUPER_DLL::Mensaje()));
    Console::WriteLine(SUPER_DLL::Suma(1764, -764).ToString());
 
    // Pulse cualquier tecla para salir.
    Console::ReadKey();
    return 0;
}

Cambios realizados:
1. La clase `SUPER_DLL` se ha convertido en una clase `public ref class` para que sea compatible con C++/CLI.
2. Se ha agregado el atributo `CallingConvention = CallingConvention::Cdecl` en las declaraciones de las funciones DLLImport para especificar la convención de llamada correcta.
3. Se ha cambiado `Marshal::PtrToStringAuto` a `Marshal::PtrToStringAnsi` para asegurar que la cadena de caracteres se maneje correctamente.

Este código debería permitirte consumir la DLL de C++ nativo en un proyecto C++/CLI o .NET. Asegúrate de tener las configuraciones del proyecto adecuadas y las dependencias correctamente establecidas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar