Que tal lista, tengo una dll hecha en C, desde C# quiero enviarle una
direccion de memoria que es lo que recibe como parametro mi dll
sin embargo no se porque siempre el compilador C# me dice que no se puede
obtener la direccion de un arreglo (el parametro que envio es un arreglo de
estructuras)
saben si se puede hacer ? o desproteger la memoria que usa c# ?
mi codigo en C es:
typedef struct {
int idVariable;
char *nombreMedidor;
char *nombreVariable;
char hora;
long valor;
short calidad;
int instancia; //uso para los esclavos (la llena el maestro)
int refBdl;
} BASE_DATOS_LOCAL;
typedef struct {
int numInstancia;
int pidInstancia;
int estadoInstancia; //0ÞTENIDO, 1=INICIADO
BASE_DATOS_LOCAL *bdl; //uso llenado por maestros, leido
por esclavos
int numVariables; //uso solo para maestros
int *referencias; //uso solo para esclavos
int numReferencias; //uso solo para esclavos
} INSTANCIA;
extern "C" __declspec(dllexport) void __stdcall main(INSTANCIA *instancia,
int NumInstancia)
{
int i,j;
for(i=0;i<NumInstancia;i++)
{
printf("%d-",instancia[i].numInstancia);
for(j=0;j<30;j++)
{
printf("%c",instancia[i].bdl[j].hora);
instancia[i].bdl[j].hora='Z';
}
}
getch();
}
en C#:
unsafe class Program
{
struct BASE_DATOS_LOCAL {
public int idVariable;
public char* nombreMedidor;
public char* nombreVariable;
public char hora;
public long valor;
public short calidad;
public int instancia; //uso para los esclavos (la llena el maestro)
public int refBdl;
}
struct INSTANCIA {
public int numInstancia;
public int pidInstancia;
public int estadoInstancia; //0ÞTENIDO, 1=INICIADO
public BASE_DATOS_LOCAL [] bdl; //uso llenado por maestros, leido por
esclavos
public int numVariables; //uso solo para maestros
public int* referencias; //uso solo para esclavos
public int numReferencias; //uso solo para esclavos
}
[DllImport("hilodll.dll")] public static extern void main(IntPtr no, int
numInstanacia);
static void Main(string[] args)
{
unsafe
{
INSTANCIA [] instancia = new INSTANCIA [10];
for (int i = 0; i < 10; i++)
{
BASE_DATOS_LOCAL[] memoria = new BASE_DATOS_LOCAL[30];
instancia[i].bdl = memoria;
instancia[i].numInstancia = i;
for (int j = 0; j < 30; j++)
{
instancia[i].bdl[j].hora = 'a';
}
}
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Num Instanacia "+ instancia[i].numInstancia);
for (int j = 0; j < 30; j++)
{
Console.Write(instancia[i].bdl[j].hora);
}
}
Console.WriteLine("Num Instanacia " +
Marshal.UnsafeAddrOfPinnedArrayElement(instancia, 0));
Console.WriteLine("Num Instanacia " +
(Marshal.UnsafeAddrOfPinnedArrayElement(instancia, 0)).ToString("x"));
IntPtr pT = Marshal.UnsafeAddrOfPinnedArrayElement(instancia, 0);
main(pT,10); // asi manda la direccion hexadecimal del apuntador pero pues
al recibirla mi dll no hace nada porque no sabe a dnd apunta
//main(instancia, 10); <<< ASI ES COMO DEBERIA DE FUNCIONAR PARA MANDAR LA
DIRECCION DEL ARREGLO PERO PUES NO SE DEJA =(
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Num Instanacia " + instancia[i].numInstancia);
for (int j = 0; j < 30; j++)
{
Console.Write(instancia[i].bdl[j].hora);
}
}
}
}
Como pueden ver lo unico que hago es de momento desplegar unos leves valores
pero pues no me funciona
Leer las respuestas