2012-01-17 13 views
6

Estoy tratando de pasar una cadena de C# a una DLL de C. Por lo que he leído, .NET debe hacer la conversión de cadena a char * para mí, sin embargo, aparece el "error CS1503: argumento '1': no ​​se puede convertir de 'cadena' a 'char *'" ¿Alguien me puede avisar de dónde estoy? han salido mal? Gracias.Pase cadena de C# a C DLL

código C#

[DllImport("Source.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 
public static unsafe extern bool StreamReceiveInitialise(char* filepath); 

const string test = "test"; 
// This method that will be called when the thread is started 
public void Stream() 
{ 
    if (StreamReceiveInitialise(test)) 
    { 


    } 
} 

C DLL

extern "C" 
{ 
    __declspec(dllexport) bool __cdecl StreamReceiveInitialise(char* filepath); 
} 
+1

¿Por qué declarar a StreamReceiveInitialise como inseguro? Ahora todavía necesita pasar un char * en lugar de una cadena. – diggingforfire

+0

Ahora he eliminado inseguro y estoy usando como se muestra en la respuesta 1. – integra753

Respuesta

3

Declarar el método externo como:

public static extern bool StreamReceiveInitialise(string filepath); 
+0

Gracias esto funciona. – integra753

1

hacerlo de esta manera:

[DllImport("Source.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.ANSI)] 
static extern bool StreamReceiveInitialise([MarshalAs(UnmanagedType.LPStr)] string filepath); 

(Marshalling como UnmanagedType.LPStr es el valor predeterminado, pero me gusta ser explícito).

+0

Ese atributo [MarshalAs] es innecesario, ya es el cálculo predeterminado para la cadena en este caso. –

+0

Pero especificar 'CharSet' en el atributo' DllImport' no sería una mala idea. –

+0

Debería haber mencionado que no necesito modificar la ruta de archivo dentro del código C. ¿Esto cambia tus comentarios? Disculpas, soy nuevo en mezclar C/C#. – integra753

1

Utilice un StringBuilder en lugar de char *. Ver this

[DllImport("Source.dll")] 
public static extern bool StreamReceiveInitialise(StringBuilder filepath);