2015-07-06 16 views
5

Tôi có phần mở rộng cho VS nên sử dụng api của Gmail để gửi thư cho một số người dùng nhất định trong công ty của tôi. Trong quá trình phát triển, tôi bước vào một vấn đề phổ biến với phiên bản System.Net.Http.Primitives bằng cách nào đó đã gây rối trong Google API.Làm thế nào để làm dll bindingRedirect trong phần mở rộng Vsix?

common solution cho việc này là đặt bindingRedirect trong app.config để chuyển hướng cuộc gọi đến phiên bản mới cập nhật của thư viện. Giống như bên dưới:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
     <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Tuy nhiên, điều này dường như không hoạt động trong trường hợp khi đầu ra của tôi là gói Vsix. Vsix đã tạo thậm chí không có app.config.

Tôi biết một giải pháp cho biết thêm bindingRedirect đến machine.config tệp nhưng tiện ích mở rộng của tôi được một số người khác sử dụng và tôi không muốn buộc họ đưa nội dung vào tệp cấu hình máy của họ.

Có giải pháp nào khác cho điều này không?

Trả lời

2

Về mặt kỹ thuật, app.config thuộc về quá trình (.exe), không phải cho các dll. Đối với Visual Studio, nó là tệp devenv.exe.config nằm tại C: \ Program Files (x86) \ Microsoft Visual Studio < phiên bản > \ Common7 \ IDE.

Nhưng để sửa đổi tệp đó, tiện ích của bạn phải được cài đặt bằng quyền quản trị (nghĩa là .msi hoặc công nghệ cài đặt tương tự). Và tôi không nghĩ rằng nên sửa đổi tệp đó vì nó sẽ ảnh hưởng đến các phần mở rộng khác.

Một cách tiếp cận mà bạn có thể thử là chuyển hướng ràng buộc bằng mã bằng cách nào đó gây ra lỗi độ phân giải lắp ráp, đăng ký AppDomain.AssemblyResolveEvent, để có cơ hội cung cấp lắp ráp chính xác mà bạn muốn. Xem: http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/

14

Điều này đã được trả lời hơn một năm trước, nhưng tôi đã tìm thấy cách tốt hơn để làm điều đó bằng cách sử dụng ProvideBindingRedirectionAttribute. Điều này sẽ thêm các chuyển hướng ràng buộc để devenv, và cũng xác định phiên bản chính xác. Thông tin chi tiết có thể được tìm thấy here, nhưng phần liên quan ở đây:

Bằng cách sử dụng các thuộc tính ProvideBindingRedirection, bạn có thể chỉ định chuyển hướng ràng buộc cho việc lắp đặt một nâng cấp lên một thành phần mở rộng. Khi bạn gửi một thành phần Visual Studio có thể mở rộng, thuộc tính này ngăn người dùng của thành phần không phải cài đặt phiên bản cũ của thành phần phụ thuộc. Nếu bạn sử dụng thuộc tính ProvideBindingRedirection, bạn không cần cập nhật thủ công tệp exe.config để chuyển hướng người dùng phiên bản lắp ráp cũ sang phiên bản mới. Thêm thuộc tính assembly AssemblyBindingRedirection là một cách dễ dàng để thêm một mục chuyển hướng ràng buộc vào tệp pkgdef. Tệp pkgdef được sử dụng để cài đặt phần mở rộng.

Ví dụ sau đây cho thấy một mục ProvideBindingRedirection trong AssemblyInfo.cs hoặc AssemblyInfo.vb file:

[assembly: ProvideBindingRedirection(AssemblyName = "ClassLibrary1", NewVersion = "3.0.0.0", OldVersionLowerBound = "1.0.0.0", OldVersionUpperBound = "2.0.0.0")]

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