2009-07-29 14 views
7

Có thể bắt buộc lắp ráp interop để tham khảo bản sao cục bộ của DLL COM liên kết của nó không?Lực lượng .NET interop sử dụng COM DLL cục bộ

Đây là kịch bản:

Tôi có một ứng dụng .NET tham chiếu đến một Interop Assembly (Interop.OTAClient.dll), đó là interop cho một COM DLL (OTAClient.dll, đó là API tự động hóa cho Trung tâm Chất lượng HP). Tôi không phải là rất am hiểu về COM, nhưng như tôi hiểu nó lắp ráp interop nhìn lên các lớp học COM thông qua tài liệu tham khảo GUID trong registry, thay vì trỏ đến một tập tin cụ thể.

Vấn đề tôi có là bản sao OTAClient.dll mà các khóa đăng ký trỏ đến bị ghi đè bởi các phiên bản khác nhau tùy thuộc vào phiên bản QC nào tôi vừa đăng nhập vào trình duyệt và các phiên bản khác nhau của các tệp DLL này không tương thích với nhau. Ứng dụng .NET sẽ chỉ kết nối với một phiên bản QC cụ thể, vì vậy tôi không thể có COM DLL thay đổi theo cách này.

Bất kỳ đề xuất nào sẽ được đánh giá cao, vì hành vi này thực sự gây khó chịu. Tôi đã nhìn thấy câu hỏi khác về các vấn đề interop COM, nhưng tất cả họ dường như về buộc một phiên bản địa phương của interop DLL được sử dụng thay vì một trong GAC, chứ không phải là kịch bản này liên quan đến COM DLL thực tế.

Trả lời

5

Bạn muốn Registration-free COM.

+0

Xin chào Pavel. Cảm ơn bạn đã liên kết - Tôi đã làm theo ví dụ và VS đã tạo mục kê khai cho OTAClient như mong đợi.Tuy nhiên, tôi vẫn thấy các triệu chứng tương tự nếu phiên bản mới hơn của DLL đã được sử dụng cuối cùng bởi ứng dụng trình duyệt cũng sử dụng DLL đó. Bạn có nghĩ rằng OTAClient có các phụ thuộc riêng của nó cũng bị ghi đè bằng các phiên bản mới hơn không? Nếu có, có đề xuất nào về cách tôi có thể đối phó với điều đó không? – Xiaofu

+0

Có thể nếu các phụ thuộc đó là các thành phần COM. Nếu vậy, bạn nên xử lý chúng theo cách tương tự (để bạn kết thúc với một bộ thư viện tự cung tự cấp). –

10

Pavel đã chỉ cho tôi đúng hướng, vì vậy tôi sẽ đánh dấu là câu trả lời của anh ấy. Vì lợi ích của mọi người khác, dưới đây là những gì tôi đã làm:

  1. Đã thêm tham chiếu đến OTAClient.dll gốc và để Visual Studio tạo thư viện interop.
  2. Nhấp chuột phải vào thư viện được tham chiếu trong Solution Explorer và nhấp vào Thuộc tính. Sau đó đặt Isolated thành True. Điều này gây ra VS để tạo ra một tệp kê khai cho chương trình của bạn để xem cục bộ cho thư viện COM của bạn thay vì tại một trong danh sách trong sổ đăng ký.
  3. Cụ thể đối với kịch bản của tôi - Tôi cũng phải tham khảo WebClient.dll từ Trung tâm chất lượng và đặt Riêng biệt thành True cho điều đó. Điều này không được sử dụng trực tiếp bởi các ứng dụng sử dụng API OTA, nhưng dường như được tham chiếu bởi OTAClient.dll.

Bằng cách này, bạn có thể đăng nhập và đăng xuất khỏi các phiên bản QC có phiên bản khác với phiên bản mà ứng dụng của bạn sử dụng mà không vi phạm. Trong trường hợp của tôi, tôi có một cá thể QC địa phương là v9 và được sử dụng cho tự động hóa dự án (vì nhiều lý do khác nhau, nó được tùy chỉnh rất nhiều để đáp ứng nhu cầu của chúng tôi, có nhiều không gian để lưu trữ ảnh chụp màn hình vv) và ứng dụng của tôi kết nối. Tuy nhiên, để kiểm tra thủ công, tôi cũng cần phải đăng nhập bằng IE trong một phiên bản v9.2 ở nơi khác. Nếu trước đó tôi đã đăng nhập vào phiên bản v9.2, thì tôi sẽ phải mở cá thể v9 trong IE và để cho nó tải xuống lại các điều khiển trước khi chạy lại ứng dụng của tôi ... và bây giờ tôi không làm như vậy. :)

1

Một ví dụ nhỏ cho thấy cách Web.config thay đổi sau khi chúng tôi đặt thuộc tính Isolated thành true, sẽ giúp người khác hiểu những gì đang thực sự xảy ra khi chúng tôi đặt thuộc tính Bị cô lập thành true. VS thực sự nhập vài dòng trong mã của bạn, để nó sẽ sử dụng com Dll của CLSID cụ thể.

Thực ra tôi có hai ứng dụng .Net trên cùng một máy chủ, trong đó một ứng dụng sử dụng Trung tâm chất lượng 10.0 dll và Khác được nâng cấp lên trung tâm chất lượng ALM 11.0. Vì vậy, trên cùng một máy chủ, chúng tôi không thể đăng ký một DLL có cùng tên.