Ran vào một vấn đề thú vị mà tôi đã tự hỏi nếu có ai có thể giúp giải thích. Tôi đã thử tìm kiếm trên internet và dường như không tìm thấy câu trả lời cho vấn đề này. Trong khi chúng tôi có một giải pháp, những người khác có thể chạy vào cùng một vấn đề, và vì nó là ngẫu nhiên, rất khó để theo dõi.Marshalling "như chuỗi" tham số từ C#
Chúng tôi có một ứng dụng ngẫu nhiên không thành công khi máy tính được kết nối với mạng công ty của khách hàng (không có nhiều thông tin trên mạng). Khi chúng tôi đưa máy tính vào môi trường của chúng tôi, nó hoạt động tốt. Thất bại là khá ngẫu nhiên, nhưng tốt nhất là tôi có thể tìm ra xảy ra trong các cuộc gọi từ C# đến một nhà cung cấp bên thứ ba không được quản lý DLL. Một trong những dấu vết sao tôi có (chỉ có một vài thất bại cung cấp dấu vết trong bản ghi sự kiện hệ thống) điểm đến một thất bại trong ntdll.dll trong các chức năng RtlMoveMemory trong marshalling các tham số trong các cuộc gọi đến DLL không được quản lý.
Cuộc gọi đến hàm không được quản lý là:
ThirdParty.CxxxAutomationWrapper clientDLL = new ThirdParty.CxxxAutomationWrapper() ;
object Parameter1 ;
:
string theValue = "abcde" ;
Parameter1 = theValue ;
:
if (Parameter1 is string)
{
int returnCode = clientDLL.function (Parameter1 as string) ;
}
Cuộc gọi định kỳ không thành công trên máy tính khách hàng nhưng luôn luôn hoạt động khi chạy trong Visual Studio (2010). Giá trị của Parameter1 được đặt chính xác (không bao giờ null).
Kể từ khi tôi đã thay đổi cuộc gọi đến:
String parameter1String = Parameter1.ToString() ;
int returnCode = clientDLL.function (parameter1String) ;
tất cả mọi thứ đã làm việc tốt. Giá trị của Parameter1 được kiểm soát và không phải là null trước khi mã này được thực hiện.
Giao diện được gọi là (clientDLL.function) được định nghĩa là: [? Giới hạn]
HRESULT function ([in] BSTR parameter,
[out, retval] long *ret);
Với tôi hiểu biết về 'là' tuyên bố trong C#, tôi không hiểu tại sao phiên bản đầu tiên của điều này không thành công. Ai có thể giúp giải thích tại sao điều này không thành công khi được gọi với tham số được chỉ định là "như chuỗi"?
Đã cập nhật bài đăng gốc để trả lời các câu trả lời mà tôi đã nhận được để giúp làm rõ vấn đề. Các cập nhật bao gồm hiển thị Parameter1 được khai báo và gán như thế nào, và đặt một if (Parameter1 là string) xung quanh cuộc gọi như được đề xuất bởi Tudor. –
Bạn có thể thử đăng nhập xem giá trị nào của 'Parameter1' xảy ra không? Bạn có thể thấy bất kỳ mẫu nào không? – Tudor
Tôi đã mã hóa mã chính xác được hiển thị ở trên, mã hóa gán cho biến chuỗi khởi tạo nó bằng "abcde" và gán biến đó cho Parameter1 kiểm tra nó qua if (Parameter1 là string) và nó vẫn hoạt động tốt trong Visual Studio nhưng không thành công của VS (đôi khi). –