2010-06-21 11 views
6

Se me ha asignado asignar algunas rutinas de biblioteca a C# para que otros desarrolladores de aplicaciones puedan acceder a ellas, pero no sé cómo declarar las variables para que entren en la rutina correctamente.Dll Importe C++ a C# con matrices

El problema es que cuando me paso a través de la lectura de la entrada con el código C++, consigo todos los valores sesgados

intento de usar:

double[] Par = { 8, 16, 8, 0.61, 0.00635, ... }; // 29 variables 
double[] Inlet = { 22.18, 43.31, 1.13, 2.81, 0.43 }; // 5 variables 
double[] Outlet = { 0, 0, 0, 0, 0, 0 }; // placeholder for 6 variables 
SteadyFor(ref Par, ref Inlet, ref Outlet, FileIn, FileOut); 

La DLL de importación

[DllImport(MODELAPP, EntryPoint = "SteadyFor", ExactSpelling = false)] 
public static extern int SteadyFor(
    ref double[] par, ref double[] inlet, ref double[] outlet, 
    [MarshalAs(UnmanagedType.LPStr)] string input, 
    [MarshalAs(UnmanagedType.LPStr)] string output); 

El archivo C++:

extern "C" int SteadyFor(double Par[], double Inlet[], double Outlet[], char* FileIn, char* FileOut) 
{ 
    int n = (int)Par[0]; // Actual Reading: [0] 
    int nt = (int)Par[1]; // Actual Reading: [0] 
    int pass = (int)Par[2]; // Actual Reading: [0] 
    double l = Par[3]; // Actual Reading: [2.9581223236733198e+174] 
    double rTube = Par[4]; // Actual Reading: [2.121995790965e-314#DEN] 
    double tTube = Par[5]; // Actual Reading: [5.432309224896e-312#DEN] 
    double pl = Par[6]; // Actual Reading: [1.0253217546256438e-267] 
    double pt = Par[7]; // Actual Reading: [4.60629e-308] 
    // ... 
} 

Obviamente, los valores que obtengo son incorrectos, casi como una memoria no inicializada.

¿Podría alguien decirme qué estoy haciendo mal y cómo solucionarlo?

Saludos,

~ Joe

Respuesta

7

gota las palabras clave "árbitro" en la declaración, que no son correctos. Que el código C++ no se cuelgue con un AV es un poco misterioso.

El atributo [MarshalAs] en las cadenas no es necesario.

+0

Eso funcionó, Hans. ¿Ahora por qué? C++ está trayendo punteros, y C# está pasando ... ¿qué? ¿Punteros? – jp2code

+4

El cálculo de referencias predeterminado para una matriz pasa un puntero a su primer elemento. Al igual que C++. A las matrices nunca se les transfiere valor, eso sería terriblemente caro y estaría condenado al fracaso en arreglos grandes. Cuando usa "ref", pasa un puntero a ese puntero. –

1

Básicamente tiene que declarar un atributo de clasificación. En su caso, sería un atributo MarshalAs (UnmanagedType.LPArray).

vistazo aquí:
http://msdn.microsoft.com/en-us/library/z6cfh6e6%28VS.80%29.aspx#cpcondefaultmarshalingforarraysanchor3

+0

Nuestro proxy en el trabajo no puede analizar los sitios de MSDN. Lo investigaré más tarde. Por ahora, ¡voy a codificar con tu respuesta! Gracias. – jp2code

+0

@ jp2code, espero que su MSDN instalado localmente funcione ...! – code4life

+0

Ratas. Eso no funcionó. Todos los valores siguen siendo enteros, siendo los ceros y los dobles algo extraño. – jp2code