2012-01-17 43 views
6

Tôi đang cố gắng chuyển một chuỗi từ C# đến một DLL C. Từ những gì tôi đã đọc .NET nên làm việc chuyển đổi từ chuỗi để char * cho tôi, tuy nhiên tôi nhận được "lỗi CS1503: Argument '1': không thể chuyển đổi từ 'chuỗi' thành 'char *'" Ai đó có thể tư vấn cho tôi về nơi tôi đã đi sai? Cảm ơn.Vượt qua chuỗi từ C# đến C DLL

C# code

[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

Tại sao tuyên bố StreamReceiveInitialise là không an toàn? Bây giờ bạn vẫn cần phải vượt qua một char * thay vì một chuỗi. – diggingforfire

+0

Tôi hiện đã xóa không an toàn và đang sử dụng như được hiển thị trong câu trả lời 1. – integra753

Trả lời

3

Khai báo phương pháp bên ngoài của bạn như:

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

Cảm ơn tác vụ này đã hoạt động. – integra753

1

Làm điều đó như thế này:

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

(Marshalling as UnmanagedType.LPStr là mặc định, nhưng tôi thích được rõ ràng).

+0

Thuộc tính [MarshalAs] là không cần thiết, nó đã là marshaling mặc định cho chuỗi trong trường hợp này. –

+0

Nhưng việc chỉ định 'CharSet' trên thuộc tính' DllImport' sẽ không phải là một ý tưởng tồi. –

+0

Tôi đã đề cập đến tôi không cần sửa đổi filepath trong mã C. Điều này có thay đổi nhận xét của bạn không? Xin lỗi tôi mới trộn C/C#. – integra753

1

Sử dụng StringBuilder thay cho char *. Xem this

[DllImport("Source.dll")] 
public static extern bool StreamReceiveInitialise(StringBuilder filepath); 
Các vấn đề liên quan