Vì vậy, tôi có một chức năng, được viết bằng C++, trông như thế này ...Tại sao C# và VB.NET ngầm hoàn toàn char * khác nhau?
extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
// stuff
}
... và tôi đang sử dụng nó trong dự án hiện tại của tôi (viết bằng C#). Có những dự án khác sử dụng chức năng này viết bằng VB, nhìn như thế này:
Public Declare Function SomeFunction Lib "MyDLL.dll" _
Alias "[email protected]" (ByVal theData As String) As Integer
Vì vậy, tôi cố gắng viết một tương đương trong C#, nhưng thấy rằng việc sử dụng các loại chuỗi không thực sự làm việc cho tôi - chuỗi sẽ quay trở lại với cùng một dữ liệu tôi đã truyền vào. Tôi đã thử sử dụng "ref string"
thay vì chuyển chuỗi bằng cách tham chiếu và tôi bị vi phạm quyền truy cập bộ nhớ.
Sau khi thực hiện một số đào, tôi thấy rằng đây là việc thực hiện đúng trong C#:
[DllImport("MyDLL.dll", EntryPoint = "[email protected]")]
public static extern int SomeFunction(StringBuilder theData);
Bây giờ tôi biết rằng VB.NET và C# khá khác nhau, nhưng tôi cho rằng tôi luôn luôn giả định rằng chuỗi là chuỗi . Nếu một ngôn ngữ có thể sắp xếp theo thứ tự char*
thành String
thì tại sao người khác lại không thể yêu cầu một lớp khác?
(chỉnh sửa tiêu đề để rõ ràng)
Có thể thú vị khi xem cả hai phiên bản với JustDecompile hoặc .NET Reflector. –