2012-05-02 42 views
6

Tôi có một khách hàng/đối tác đang cố gắng liên kết ứng dụng của họ với ứng dụng của chúng tôi bằng chức năng COM được tiếp xúc của chúng tôi. Cho đến nay, họ đã có một đối tượng COM đại diện cho một thể hiện của gói phần mềm của chúng tôi và sau đó sử dụng các phương thức COM của chúng tôi để lập trình xây dựng một cái gì đó cho người dùng dựa trên những gì họ đã làm trong ứng dụng của họ. Về cơ bản nó là một tính năng "xuất khẩu".Phát hành "quyền sở hữu" đối tượng COM trong .NET

Những gì họ đã yêu cầu tôi làm, mà tôi không thể tìm ra cách thực hiện là cho phép người dùng quyết định thời điểm phiên bản được đóng. Ý tôi là, khi gói phần mềm của chúng tôi được tải lên, nó có thể xem và được tương tác với người dùng. Khi họ hoàn thành, họ sẽ tự nhiên nhấp vào thập tự giá ở trên cùng bên phải để thoát khỏi phần mềm. Điều này không làm việc như đối tượng COM vẫn còn "hoạt động" trong ứng dụng của họ. Gói phần mềm của chúng tôi chỉ có thể được đóng bằng cách giết chết quá trình trong trình quản lý tác vụ trong khi ứng dụng tải nó qua COM vẫn mở. Sau khi ứng dụng của họ thoát, chúng tôi sẽ tự động đóng. Có vẻ như ứng dụng của họ "sở hữu" chúng tôi vì cuộc gọi COM.

Tôi đã tạo một ứng dụng demo nhanh trong C# để thử sử dụng những thứ như Marshal.FinalReleaseComObject(myObject) không có kết quả.

Tôi nhận thấy rằng việc sử dụng COM cho loại điều này không thực sự là mục đích của nó, nhưng hy vọng có một số cách giải quyết khác? Khách hàng/đối tác đang sử dụng VB.NET nhưng C# vẫn ổn.

+0

Hãy làm rõ nếu ứng dụng của bạn được tự động từ bên trong ứng dụng (tương tự như VBA scripting bên trong ứng dụng VS hoặc Office) hoặc từ bên ngoài (tương tự như sử dụng Tự động hóa Word để tạo tài liệu mới từ ứng dụng console/script của riêng bạn)? –

+0

Họ không thể đóng cửa sổ? Điều đó không có ý nghĩa, bạn sẽ cần phải làm rõ. –

+0

Đó là từ bên ngoài, họ đang sử dụng VB để bắt đầu một quá trình mới bằng cách tham khảo exe của chúng tôi và instantiating một đối tượng COM từ nó. Chúng tôi có một "Open" mà không chính xác những gì nó giống như âm thanh, mở ra một cửa sổ có thể sử dụng của gói phần mềm của chúng tôi. Trong điều khoản của việc không thể đóng cửa sổ, bạn không thể nhấp vào X màu đỏ ở phía trên bên phải, bạn cũng có thể nhưng không có gì xảy ra. Nó sẽ chỉ đóng khi ứng dụng VB của họ bị đóng. Tôi không biết nhiều về COM interop nhưng có vẻ như ứng dụng VB có quyền sở hữu hoặc là cha mẹ của quá trình đó. – sxthomson

Trả lời

3

Bạn đã để lại một số thông tin quan trọng về ứng dụng của riêng bạn, bao gồm quan trọng nhất là cách bạn đang triển khai các giao diện COM mà bạn trưng ra cho ứng dụng khách. Một khía cạnh của mô tả của bạn là một lá cờ đỏ cho tôi là sự khởi tạo ứng dụng của bạn. Bạn nói rằng ứng dụng của khách hàng là "sử dụng VB để bắt đầu một quy trình mới bằng cách tham chiếu đến exe của chúng tôi". Điều này không cần thiết nếu bạn đã triển khai và đăng ký đúng máy chủ COM của mình. Hãy để tôi cho bạn biết kiến ​​trúc tôi sẽ sử dụng để hoàn thành những gì bạn yêu cầu và hy vọng điều này sẽ hữu ích cho bạn.

Để bắt đầu, nếu bạn muốn cung cấp đối tượng COM từ trong một quy trình riêng biệt, cách thích hợp là triển khai COM ra khỏi máy chủ quy trình. Với một máy chủ quá trình, COM sẽ tự động khởi động ứng dụng của bạn khi một khách hàng yêu cầu một trong các giao diện của bạn thông qua COM. Một phần của các yêu cầu thực hiện của một máy chủ quá trình là tắt tự động khi khách hàng COM cuối cùng phát hành con trỏ giao diện cuối cùng của họ.

Để hiển thị một giao diện người dùng từ máy chủ quá trình, bạn sẽ muốn sinh ra một chuỗi căn hộ Single-threaded (STA) riêng biệt với một vòng lặp tin nhắn. Điều này sẽ cho phép bạn đóng bất kỳ cửa sổ nào trên chuỗi STA, bao gồm cả cửa sổ chính, mà không làm hỏng máy chủ COM của bạn. Đó là bởi vì việc triển khai máy chủ COM sẽ chạy chuỗi chủ đề vòng lặp tin nhắn đa luồng (MTA) của riêng nó để hỗ trợ COM trong các cuộc gọi proc. Chuỗi MTA là luồng ứng dụng chính và máy chủ sẽ tắt nó khi giao diện khách hàng cuối cùng được phát hành.

Máy chủ COM không được tắt trong khi giao diện vẫn chưa được phát hành. Điều này có nghĩa là ứng dụng khách có trách nhiệm phát hành giao diện đúng cách. Nhưng khung kiểm tra .NET của bạn nên đã làm điều này, do đó, nó xuất hiện một cái gì đó là không đúng với việc thực hiện của bạn.

Giả sử bạn làm theo hướng dẫn này, bạn sẽ cần một kế hoạch để xử lý trường hợp trong đó giao diện khách hàng cuối cùng được phát hành nhưng bạn vẫn có các cửa sổ giao diện người dùng mở. Một khi bạn nhận được tất cả mọi thứ thiết lập một cách chính xác, điều này không phải là một vấn đề lớn. Ví dụ, bạn có thể chỉ cần tham chiếu đến một trong các giao diện của riêng bạn trong khi giao diện người dùng mở, điều này sẽ ngăn chặn một MTA tắt máy.

Các vấn đề liên quan