2012-01-17 21 views
6

C# ile C DLL arasında bir dize iletmeye çalışıyorum. Okuduğumdan .NET, dizgeden char * 'a dönüşüm yapmalı, ancak "hata CS1503: Argüman' 1 'olsun:' string 'den' char * '' a dönüşemez." yanlış mı gitti? Teşekkürler.Dizgeyi C# ile C DLL'den geçir

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

Neden güvensiz olarak StreamReceiveInitialise ilan ettim? Şimdi hala bir dize yerine bir char * iletmeniz gerekiyor. – diggingforfire

+0

Artık güvensiz kaldırıldı ve yanıt 1'de gösterildiği gibi kullanıyorum. – integra753

cevap

3

olarak harici yöntem bildirin

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

(Varsayılan olarak Marshalling UnmanagedType.LPStr, ancak açık olmayı severim).

+0

Bu çalışmalara teşekkürler. – integra753

1

şöyle yapın::

C# kodu

[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); 
} 
+0

Bu [MarshalAs] özniteliği gereksizdir, zaten bu durumda dizenin varsayılan marşlamasıdır. –

+0

Ancak 'DllSmport' özniteliğinde' CharSet 'belirtmek kötü bir fikir olmaz. –

+0

C kodunda dosya yolunu değiştirmem gerekmediğini belirtmeliydim. Bu, yorumlarınızı değiştirir mi? Özür dilerim C/C# karıştırmak için yeniyim. – integra753

1

char * yerine bir StringBuilder kullanın. this

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