2009-07-09 5 views
10

Tôi có một dự án được quản lý (asp.net, thực sự) tham chiếu đến một DLL COM. Ngay bây giờ, các tài liệu tham khảo trong csproj trông như thế này:Có thể tham khảo một DLL COM trong một dự án được quản lý bằng đường dẫn chứ không phải bởi GUID không?

<COMReference Include="thenameinquestion"> 
    <Guid>{someguidhere}</Guid> 
    <VersionMajor>1</VersionMajor> 
    <VersionMinor>0</VersionMinor> 
    <Lcid>0</Lcid> 
    <WrapperTool>tlbimp</WrapperTool> 
</COMReference> 

này hoạt động, nhưng nó có hậu quả đáng tiếc rằng DLL cần phải được đăng ký trên máy xây dựng, có nghĩa là (trong số những thứ khác) đó là bất tiện để xây dựng nhiều phiên bản của dự án sử dụng các phiên bản khác nhau của DLL trên cùng một máy xây dựng.

MSDN hiển thị tác vụ ResolveComReference có vẻ như nó đúng, nhưng google-search-fu của tôi chưa đủ tốt để đưa ra ví dụ thực tế về cách sử dụng của nó. Có thể làm những gì tôi muốn không? Có phải tôi đang trên đường ray bên phải không?

Trả lời

3

Vì đã John Fisher chỉ ra bạn đang tìm kiếm Registration-Free COM Interop. Có rất nhiều câu hỏi liên quan đến vấn đề này, hãy tìm 'thẻ trong tay' regfreecom và thẻ có liên quan chặt chẽ sxs.

Bạn sẽ dễ dàng nhận thấy, tuy nhiên, điều này có thể là một đấu trường khó khăn, cụ thể:

  • Có vẻ như một lỗi confirmed ảnh hưởng này trên Windows XP, xem here để biết chi tiết. Hiện đã có hotfix, có thể đủ miễn là bạn chỉ nhắm mục tiêu một môi trường được kiểm soát, ví dụ: máy xây dựng của bạn.
  • Vì bạn đang nhắm mục tiêu ASP.NET, bạn nên lưu ý rằng ngược lại với ví dụ: một ứng dụng máy tính để bàn điều này ngụ ý rằng bạn không kiểm soát quá trình lưu trữ, điều này có thể khác nhau tùy thuộc vào nền tảng triển khai. Điều này có nghĩa là sẽ không dễ dàng cung cấp tệp kê khai ứng dụng cần thiết để kiểm soát ràng buộc thời gian chạy và kích hoạt thành phần COM của bạn trong máy chủ (xem điểm tiếp theo để có giải pháp thay thế tiềm năng).
  • ASP.NET 2.0 dường như làm phức tạp nhiều thứ hơn bằng cách giảm chức năng cạnh nhau cho các thành phần không được quản lý. Tôi đã không tìm thấy nguồn chính thức cho điều này nhưng tác giả của Isolating ASP .Net 2.0 Applications dường như đang được biết; anh ta cung cấp một cách giải quyết ít nhất, có vẻ phức tạp và có khả năng mong manh.

Tóm tắt điều này tôi muốn nhấn mạnh rằng 'Đăng ký miễn phí COM Interop' có thể rất hữu ích và dễ dàng nhiều kịch bản. Tuy nhiên nó có thể không làm cho mọi thứ dễ dàng hơn hoặc thậm chí có thể ở tất cả cho kịch bản và môi trường cụ thể của bạn (được lưu trữ trên ASP.NET).

Chúc bạn may mắn, vui lòng cho chúng tôi biết bạn có thành công không!

-1

Có vẻ như không thể - Visual Studio sẽ chỉ xem GUID được đề cập trong tham chiếu, nó không quan tâm đến đường dẫn được gợi ý ở đó.

Chúng tôi đã gặp sự cố tương tự với máy chủ tạo hàng ngày của chúng tôi - ứng dụng khách COM sẽ không biên dịch trừ khi máy chủ COM được đăng ký. Chúng ta vừa thêm đăng ký/unregistration vào trình tự xây dựng - nó đăng ký (regsv32) thành phần, sau đó VS được chạy từ dòng lệnh và ngay lập tức khi hoàn thành VS nó unregisters thành phần (regsvr32 -u). Chạy trơn tru.

8

Khi bạn tham khảo một COM DLL, Visual Studio tự động tạo ra một hội đồng interop cho nó.Tôi thấy rằng việc kiểm soát thủ công quá trình này là một cách tuyệt vời để tách các bản dựng COM và .NET.

  1. Tạo lắp ráp interop của riêng bạn cho DLL COM sử dụng tlbimp.exe. Xem MSDN để biết thông số dòng lệnh.
  2. Tham khảo lắp ráp interop của bạn trong dự án .NET thay vì DLL COM.

Khi bạn thực hiện việc này, bạn không còn phải có DLL COM được đăng ký trên máy khi bạn xây dựng giải pháp .NET, chỉ cần lắp ráp interop của bạn.

Việc lắp ráp interop có thể nằm trong một thư mục không thay đổi mãi mãi cho đến khi (a) COM DLL phá vỡ tính tương thích nhị phân, hoặc (b) thay đổi giao diện COM được thực hiện là mã .NET thực sự sử dụng.

Nếu bạn có các phiên bản khác nhau của tệp COM DLL tương thích nhị phân, hãy biên dịch hội đồng interop dựa vào phiên bản sớm nhất chứa các giao diện mà mã .NET yêu cầu. Sau đó, bạn sẽ không phải cập nhật lắp ráp interop cho các phiên bản khác nhau.

Ngoài ra, bạn không cần phải bao gồm COM DLL trong trình cài đặt của mình nếu bạn ở vị trí giả định rằng DLL COM đã được cài đặt trên máy đích.