Tôi đang gặp sự cố với COM Interop, tình hình như sau:Sử dụng Máy chủ COM 32 bit từ Chương trình .NET 64bit
Máy chủ 32 bit COM Exe (được lập trình trong C++) cung cấp một lớp với một số chức năng thành viên đối phó với phần cứng của bên thứ 3 (Phần cứng này cũng liên kết máy chủ COM Exe với 32-Bit, vì nhà sản xuất không hỗ trợ 64-Bit).
Tôi muốn sử dụng máy chủ API 32 bit COM trong ứng dụng .NET 64 bit (C#) ... Lúc đầu, tôi đã cố gắng thêm tham chiếu đến Máy chủ Exe trong Visual Studio 2010 và nó tạo ra một Interop -DLL. Đây Interop-DLL cung cấp cho tôi với các chức năng cần thiết, một trong số họ được khai báo là:
int Initialize(ref string callingApplicationPath);
Việc kê khai ban đầu trong C++ trông như thế này:
LONG Class::Initialize(BSTR* callingApplicationPath)
... và như thế này trong IDL:
[id(1)] LONG Initialize([in] BSTR* callingApplicationPath);
Tuy nhiên, khi tôi muốn gọi hàm này từ C# qua Interop-DLL, nó sẽ phát ra BadImageFormatException. Dường như Interop-DLL là một DLL 32-Bit (Có thể có khả năng tạo ra một 64-Bit-DLL?).
nỗ lực tiếp theo của tôi là để nhanh chóng Server Exe với mã này:
Type type = Type.GetTypeFromProgID("OurCompany.Class");
Object o = Activator.CreateInstance(type);
Object[] args = { Marshal.StringToBSTR(str) };
Object result = type.InvokeMember("Initialize", BindingFlags.InvokeMethod, null, o, args);
Mã này, mặt khác, ném một TargetInvocationException (Cụ thể hơn: 0x80020005 (DISP_E_TYPEMISMATCH)) tại đầu tôi. Thật không may tôi đã không thể tìm ra loại tôi phải vượt qua trong các chức năng từ C# ... Tôi đã thử tất cả các StringToXXX-chức năng trong Marshal-class nhưng không có gì có vẻ làm việc:/Tôi đoán tôi thiếu một cái gì đó đơn giản ở đây nhưng tôi không thấy gì.
Bất kỳ trợ giúp nào được đánh giá cao!
Trân trọng
Christian
Bạn đã cố gắng kích hoạt Trình theo dõi quy trình và xem điều gì đang xảy ra khi quá trình tạo xong chưa? Có lẽ nó không tìm thấy một số mục đăng ký, hoặc một số quá trình có đủ quyền? Quy trình giám sát di chuyển trợ giúp với điều đó. – sharptooth
@sharptooth: Bản thân nó cũng hoạt động tốt và tôi có thể gọi thành công một phương thức giả mà không có đối số và trả về một int. Vấn đề là "chỉ" chuyển đổi System.String -> BSTR * – Christian
Tôi hiểu. Điểm BSTR * là gì khi tham số "trong"? Tại sao không chỉ BSTR? – sharptooth