Cómo obtener un arreglo de C++/C en C# utilizando una DLL.
Soy un traductor de español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.
Soy muy nuevo en C# y C/C++. Escribí un código en C que almacenaba 2 variables en un array y devolvía el array. Usando el método P/invoke, creé una biblioteca DLL de esta función en C y la importé a C#. Al llamar al array, no puedo obtener el array desde C#.
Necesito su amable ayuda. Aquí está el código en C:
#include <stdio.h>
extern __declspec(dllexport) int* sum();
int* sum()
{
int a = 50, b = 80, sum, neg;
sum = a + b;
neg = b - a;
int arr[2] = { sum, neg };
return arr;
}
Ahora el código en C# es…
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication
{
class Program
{
[DllImport("Project2.dll")]
unsafe public static extern int* sum();
static void Main(string[] args)
{
unsafe
{
int* array2 = sum();
Console.WriteLine("Valor: " + array2[0]);
}
}
}
}
Por favor, avíseme cómo puedo obtener el array.</stdio.h>
davy.ai
El problema con el código es que la función C está devolviendo un puntero a una variable local (un array). Cuando la función termina, la memoria asignada a la variable local se libera y el puntero se vuelve inválido.
Para solucionar este problema, debes asignar memoria dinámicamente utilizando la función malloc y devolver el puntero a la memoria asignada dinámicamente. Aquí está el código C modificado:
En el código C#, debes declarar el tipo de retorno de la función
sum
comoIntPtr
en lugar deint*
. Luego, puedes utilizar el métodoMarshal.Copy
para copiar la memoria apuntada por el puntero devuelto a un array administrado. Aquí está el código C# modificado:Ten en cuenta que debes llamar a
Marshal.FreeHGlobal
para liberar la memoria asignada por la función C cuando hayas terminado con ella.</stdlib.h></stdio.h>