2010-12-27 18 views

Trả lời

3

Nếu bạn có thể sửa đổi dll C++, hãy xuất phiên bản chuỗi đơn giản. Nếu không, bạn phải xây dựng một dự án trình bao bọc C++ được quản lý, nhập tệp dll C++ khác, xuất nó dưới dạng hàm được quản lý và gọi nó từ mã C# của bạn. C + + interop thực sự sucks.

3

Tôi e rằng bạn sẽ phải tạo lớp StringStream của riêng bạn trong C# để có thể sử dụng các hàm được xuất từ ​​tệp DLL đó. Như bạn đã đề cập, .NET Framework không cung cấp bất kỳ lớp tương tự nào trong hộp.

Cách dễ nhất có lẽ là bọc lớp StringBuilder do .NET Framework cung cấp sao cho nó có thể hoạt động như một luồng. Xem this blog post để được giải thích thêm và một số mã mẫu.

Câu hỏi tương tự cũng được trả lời trong Tạp chí MSDN: http://msdn.microsoft.com/en-us/magazine/cc163768.aspx. Bạn có thể tìm thấy một số gợi ý và/hoặc mã mẫu có sẵn ở đó.

11

Bạn không nên để lộ các đối tượng templated qua một DLL, dấu chấm.

Đối tượng được dán tem (ví dụ: hầu hết mọi thứ trong std::) đều được inlined. Vì vậy, theo cách này, DLL của bạn nhận được bản sao riêng của nó về việc thực thi. Các mô-đun gọi DLL của bạn cũng sẽ nhận được thực hiện riêng của mình stringstream. Đi qua giữa chúng có nghĩa là bạn vô tình dệt hai triển khai không liên quan với nhau. Đối với nhiều dự án, nếu bạn đang sử dụng cùng một cài đặt xây dựng chính xác, có thể không có vấn đề gì.

Nhưng ngay cả khi bạn sử dụng cùng một trình biên dịch, và trộn một bản phát hành DLL với một EXE gỡ lỗi, bạn sẽ tìm thấy đống/heap tham nhũng và khó khăn hơn để tìm các vấn đề.

Và đó chỉ là việc sử dụng DLL của bạn từ một tệp exe/dll C++ không được quản lý khác. Crossing sau đó các dòng để. NET thậm chí còn nhiều hơn một vấn đề.

Giải pháp là thay đổi giao diện DLL của bạn thành thứ gì đó phát thân thiện trên các giới hạn DLL. Hoặc là COM (bạn có thể sử dụng ví dụ IStream) hoặc chỉ một giao diện kiểu C như winapi.

+0

Tôi cố gắng để nhập khẩu một hàm trong không được quản lý C++ mà sẽ đưa std: string như tham số vào chương trình C# và đã nhận lỗi sau thời gian chạy: "Unhandled Exception: System.AccessViolationException: Toan đọc hoặc ghi bộ nhớ được bảo vệ.Điều này thường là một dấu hiệu cho thấy bộ nhớ khác bị hỏng.Tại Win32API.processRequestWithStream (String & inputString, String & outputString) tại Win32API.Main() "- Điều gì có thể là nguyên nhân gây ra lỗi này? – user186246

+1

'std :: string' là một' typedef' của 'std :: basic_string ', tức là, nó giống như templated là 'stringstream'. –

+1

Và còn những con trỏ thông minh khác nhau thì sao?Nếu tôi thực hiện điều này theo nghĩa đen, điều này có nghĩa là người ta không nên phơi bày C++ không tầm thường qua các giới hạn DLL. –

0

Bạn đang cố gắng liên kết mã C++ gốc với mã được quản lý trong C#. Cách tốt nhất để làm điều đó nói chung là giới thiệu tầng giữa trong quản lý C++ sẽ cung cấp giao diện cho các cuộc gọi từ C#.

0

Tạo một tệp Trình bao bọc trong c hoặc C++ để hiển thị một cuộc gọi thân thiện với hàm đó. Đó là cách tốt hơn.

ví dụ một

BOOL getString(TCHAR * myreturnString, DWORD *size); 
Các vấn đề liên quan