Đó là một tài sản thời gian biên dịch!
Một trong những điều quan trọng nhất cần biết là "Phiên bản cụ thể" là một thuộc tính có hiệu lực vào thời gian biên dịch và không phải trong thời gian chạy.
Cái này chủ yếu là gì?
Khi một dự án được xây dựng, các tham chiếu lắp ráp của dự án cần phải được giải quyết để tìm các tổ hợp vật lý mà hệ thống xây dựng nên sử dụng. Nếu kiểm tra "Phiên bản cụ thể" được thực hiện (xem phần "Khi nào" Phiên bản cụ thể "được chọn?"), Nó sẽ ảnh hưởng đến kết quả của quá trình phân giải lắp ráp:
- Hệ thống xây dựng định vị một tổ hợp vật lý mà nó có khả năng có thể sử dụng
- Hệ thống xây dựng so sánh phiên bản lắp ráp vật lý với phiên bản lắp ráp được lưu trữ trong tệp .csproj để tham chiếu lắp ráp
- Nếu hai phiên bản lắp ráp hoàn toàn giống nhau, quá trình phân giải thành công và lắp ráp vật lý được tìm thấy được sử dụng cho bản dựng
- Nếu hai phiên bản lắp ráp không khớp nhau, lắp ráp vật lý sẽ bị loại bỏ và quá trình phân giải tiếp tục bằng cách xác định vị trí lắp ráp tiềm năng tiếp theo
- Nếu không thể lắp ráp vật lý tiềm năng hơn nữa, quá trình giải quyết thất bại. Điều này dẫn đến một cảnh báo trình biên dịch (cảnh báo MSB3245) cho bạn biết rằng tham chiếu không thể được giải quyết.
- Thật thú vị, việc xây dựng sau đó tiếp tục! Nếu mã không có tham chiếu thực tế đến lắp ráp, quá trình xây dựng thành công (với cảnh báo được đề cập trước đó). Nếu mã có tham chiếu, bản dựng không thành công với lỗi trông như thể mã đang sử dụng các kiểu hoặc không gian tên không xác định. Dấu hiệu duy nhất tại sao bản dựng thực sự thất bại là cảnh báo MSB3245.
Thứ tự trong đó các hội đồng được giải quyết
Thứ tự trong đó quá trình phân giải lắp ráp xác định vị trí lắp ráp tiềm năng là:
- Tập hợp được tham chiếu bởi
<HintPath>
phần tử trong tệp .csproj
- Đường dẫn đầu ra của dự án
- GAC
Lưu ý rằng nếu một số phiên bản của hội đồng tồn tại trong GAC, trước tiên, quá trình phân giải sẽ cố gắng phân giải thành phiên bản với phiên bản cao nhất. Điều này chỉ quan trọng nếu kiểm tra "Phiên bản cụ thể" không được thực hiện.
Khi nào "Phiên bản cụ thể" được kiểm tra?
Visual Studio đưa ra quyết định có nên thực hiện kiểm tra "Phiên bản cụ thể" trên hai mẩu thông tin được tìm thấy trong tệp .csproj hay không:
- Sự hiện diện hay vắng mặt của
<SpecificVersion>
phần tử và giá trị của nó (nếu có)
- Sự hiện diện hay vắng mặt của thông tin phiên bản trong tài liệu tham khảo lắp ráp
Đây là cách một tham chiếu lắp ráp điển hình với thông tin phiên bản trông như sau:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
Và đây là cách tham chiếu lắp ráp trông như thế nào mà không có thông tin phiên bản:
<Reference Include="Foo">
[...]
Bảng sau đây cho thấy khi kiểm tra "Phiên bản cụ thể" được thực hiện và khi nào thì không.
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
Điều đáng ngạc nhiên ở đây là không có kiểm tra nào được thực hiện nếu cả hai <SpecificVersion>
và thông tin phiên bản đều vắng mặt (trường hợp 6). Tôi đã mong đợi việc kiểm tra sẽ được thực hiện và luôn luôn thất bại (giống như trường hợp 2) bởi vì theo tôi hiểu sự vắng mặt của <SpecificVersion>
hàm ý giá trị mặc định "Đúng". Đây có thể là một sự giải thích của Visual Studio 2010 nơi tôi đã thực hiện các bài kiểm tra của mình.
Khi bạn kiểm tra các thuộc tính của tham chiếu lắp ráp trong Giao diện người dùng Visual Studio (chọn tham chiếu và nhấn F4), giá trị bạn thấy cho thuộc tính "Phiên bản cụ thể" sẽ cho bạn biết liệu Visual Studio có thực hiện "Phiên bản cụ thể" hay không kiểm tra. Trong trường hợp 6, UI sẽ hiển thị "True", mặc dù <SpecificVersion>
phần tử không có trong tệp .csproj.
Tác dụng phụ trên "Sao chép cục bộ"
Nếu thuộc tính "Sao chép cục bộ" được đặt thành "Đúng" nhưng quá trình phân giải lắp ráp không thành công do kiểm tra "Phiên bản cụ thể", không có bản sao nào được sao chép.
Tài liệu tham khảo