Tôi muốn nhập một tệp DLL C++ không được quản lý và gọi hàm stringstream
làm tham số. Trong C#, không có lớp stringstream
, vì vậy bất cứ ai có thể cho tôi biết cách gọi một hàm như vậy từ một chương trình C#?Làm thế nào tôi có thể gọi một hàm của một DLL C++ chấp nhận một tham số kiểu stringstream từ C#?
Trả lời
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.
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 ở đó.
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.
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#.
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);
- 1. Làm thế nào tôi có thể viết một hàm C chung để gọi một hàm Win32?
- 2. Bạn có thể gọi một C# DLL từ một DLL C?
- 3. Làm cách nào để chuyển một hàm C# delegate sang một Managed C++ .Dll?
- 4. Làm cách nào để gọi hàm trong C++ Dll từ C# có void * callback và tham số đối tượng
- 5. Làm thế nào tôi có thể tham khảo một hàm tạo từ nhận xét XML của C#?
- 6. Làm thế nào tôi có thể tự động gọi một hàm tạo trong C#?
- 7. Làm thế nào tôi có thể viết một mẫu hàm có thể chấp nhận một chồng hoặc một hàng đợi?
- 8. C# Singleton với hàm tạo chấp nhận tham số
- 9. Làm thế nào để có được một mô tả lỗi std :: ngoại lệ khi gọi một C++ dll từ C#
- 10. Gọi một dll c từ C++, C# và ruby
- 11. Làm thế nào tôi có thể nhập dll của một ++ lớp C bên trong một không gian tên
- 12. Gọi hàm delphi DLL từ C# Code
- 13. Tôi có thể có macro C chấp nhận số tham số không xác định không?
- 14. Tôi có thể viết một hàm C++ chấp nhận cả một con trỏ thô và một con trỏ thông minh?
- 15. Làm thế nào tôi có thể phủ nhận một hàm trong C++ (STL)?
- 16. Làm thế nào tôi có thể truyền một mảng làm tham số cho một hàm vararg?
- 17. Có thể hạn chế một tham số kiểu phương thức chung của C# như "có thể gán từ" tham số kiểu của lớp có chứa không?
- 18. Làm thế nào tôi có thể chuyển một sự kiện đến một hàm trong C#?
- 19. Làm cách nào để gọi hàm không được quản lý có tham số char [] làm tham số OUT từ C#?
- 20. C++ 0x lambda, làm thế nào tôi có thể chuyển như một tham số?
- 21. Cách gọi hàm C# DLL từ VBScript
- 22. Làm thế nào tôi có thể vượt qua một mảng const hoặc một mảng biến cho một hàm trong C?
- 23. Có thể vượt qua một lớp như một tham số cho một hàm trong C++?
- 24. Làm thế nào tôi có thể đánh dấu một tham số cụ thể là lỗi thời/không được chấp nhận trong C#?
- 25. Python có thể gọi hàm Delphi trong một DLL không?
- 26. Một đơn giản C# DLL - làm thế nào để tôi gọi nó từ Excel, Access, VBA, VB6?
- 27. chức năng Gọi từ một C++ DLL trong Delphi
- 28. Làm thế nào tôi có thể nhận được HINSTANCE từ một DLL?
- 29. Làm thế nào tôi có thể vượt qua một chức năng C thành viên ++ để một API C như một tham số
- 30. Làm thế nào để bạn vượt qua một hàm như một tham số trong C?
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
'std :: string' là một' typedef' của 'std :: basic_string', tức là, nó giống như templated là 'stringstream'. –
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. –