Cái gì / tại sao Roslyn “cần” trong thư mục / bin của Asp.Net


75

Có một loạt các câu hỏi liên quan về vấn đề này, mặc dù hầu hết các câu trả lời đều xác định Roslyn và / hoặc cung cấp "bản sửa lỗi" cho một số vấn đề ( exe, với các nhà cung cấp dịch vụ lưu trữ, v.v.)

Những gì tôi dường như không thể theo dõi là "tại sao" và "để làm gì" (có lẽ chỉ trong ngữ cảnh của ASP.Net MVC / Web API) trong /bin/roslyn.

Tôi đã gặp phải các vấn đề tương tự (lưu trữ - .exehạn chế, hỗ trợ 4.6, v.v.) và "cách khắc phục" của tôi là "chỉ triển khai cho Azure" (tất nhiên mọi thứ hoạt động mà không gặp trở ngại). Nhưng thực sự, điều này không trả lời:

  • tại sao chúng cần thiết?
  • điều này có nghĩa là chúng được sử dụng để runtimebiên dịch (bộ não của tôi chỉ ra điều này, nhưng đó là một suy đoán hoàn toàn / có lẽ sai lầm của tôi), như bài đăng SO này cho thấy - trừ khi được sửa chữa, đây là "nó" (thêm bên dưới).
  • có vẻ như "loại bỏ gói" là một "sửa chữa" (dựa trên một số câu trả lời trong quá khứ) , nhưng nếu vậy, nó (lại) đặt ra câu hỏi

Tôi nghĩ hiểu được điều này sẽ có ích - ví dụ: tôi không thể là người duy nhất nhướng mày khi thấy.exe "cần thiết" ....


Cập nhật

Để chứng tỏ rằng "những viên ngọc ẩn" tồn tại :) Tôi đã đọc đi đọc lại điều này ... dù sao thì nó đã ở đó một thời gian rồi - nhưng không phải là chuỗi nhận xét - liên kết được tham chiếu ban đầu, khoảng năm 2014, đã được thiết kế lại bởi Microsoft và các bình luận không còn hiển thị nữa ... rất may là các phần liên quan ở bên dưới.

Sai lầm LỚN - nó đã nhìn chằm chằm vào tôi suốt thời gian qua (hoặc ít nhất là kể từ cuộc trao đổi này):

Dmitry Dzygin 2 thg 6, 2015 12:53 SA

Tôi đã thử phiên bản mới nhất của gói NuGet, nhưng dường như có sự khác biệt trong cách trình biên dịch được tải / thực thi.

Trong v0.2.0.0, trình biên dịch Roslyn sẽ được tải vào bộ nhớ, cải thiện hiệu suất đáng kể cho các trang web không được biên dịch trước với nhiều tệp * .as * x / *. Cshtml. Phiên bản mới, tuy nhiên, có một/bin/roslyn/csc.exe tệp , được thực thi một lần cho mỗi tệp, loại bỏ hoàn toàn tính năng tối ưu hóa đã đề cập ở trên .....

Vàng:

XMao 2 tháng sáu 2015 1:22 CH

@Dmitry Công việc của csc.exein /bin/Roslynlà gọi VBCSCompiler.exe, nằm trong cùng một thư mục. VBCSCompiler.exe là quá trình thực hiện công việc biên dịch thực tế. Nếu VBCSCompiler đang chạy thì csc.exe sẽ sử dụng lại nó và do đó chúng tôi sẽ vẫn đạt được sự cải thiện hiệu suất đã đề cập.

Hth ...


Cập nhật: 10/2017

Có vẻ như điều này có liên quan sau tất cả thời gian này để cập nhật thêm.

Câu trả lời dưới đây của @Donny V là một lựa chọn . Bằng cách biên dịch đầy đủ ứng dụng của bạn, bao gồm tất cả Views( .cshtml/ .vbhtml), bạn sẽ không cần điều đóexe trong ứng dụng của mình.

Điều này đúng ngay cả khi Visual Studio (cho đến ngày nay, VS 2017, một cách khó hiểu) vẫn sẽ tạo /bin/roslynvà nội dung của nó trong Publishquá trình này, ngay cả khi "biên dịch đầy đủ" được đặt .

Bạn có thể kiểm tra điều này bằng cách trừ các /bin/roslynthư mục và nội dung của nó khi đẩy ứng dụng của bạn để cung cấp dịch vụ lưu trữ của bạn.

Cảnh báo :

Như đã đề cập, việc biên dịch đầy đủ ứng dụng của bạn có nghĩa là bạn sẽ phải biên dịch lại nó, ngay cả khi Viewthay đổi cấp độ.


Bạn có đang sử dụng Entity Framework không?
Jeroen Vannevel

@JeroenVannevel - không cụ thể vào lúc này, nhưng các bit vẫn ở đó và sẵn sàng ...
EdSF

Vậy EF được thêm vào như một tham chiếu cho dự án? Cho đến khi PR gần đây EF phụ thuộc vào Roslyn.
Jeroen Vannevel

1
@JeroenVannevel vâng, mặc dù nếu bộ nhớ phục vụ, nó là từ giàn giáo mặc định (trừ khi tôi đã cập nhật Nuget lên EF "mới nhất"). Tôi vẫn không hiểu mối quan hệ của nó với "cần" một tệp thực thi ( .exe) trong triển khai - có lẽ chỉ là các thư viện / dll nhưng những gì cần được thực thi bởi một exemôi trường triển khai ?
EdSF

1
@PederRice Điều này có thể được điều chỉnh bởi bất kỳ MS dân gian nào trong SO . Nếu bạn gặp sự cố lưu trữ (hạn chế exe), bạn có thể xóa các gói này trong dự án của mình , nhưng nếu gặp sự cố, bạn cần gỡ lỗi mã của mình - nếu bạn đang sử dụng một số tính năng mới hoặc những tính năng phụ thuộc Roslyn, mọi thứ sẽ hỏng. Thật không may, một cách "an toàn" là hoàn nguyên 4.5.x- đây là "bản sửa lỗi" cá nhân của tôi nếu một dự án không được dự kiến ​​triển khai Azure.
EdSF

Câu trả lời:


34

Điều này được lấy từ diễn đàn MSDN.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/442b100a-2b88-4ac4-b655-0c1345791f15/roslyn-cscexe-web-api-2-on-hosting-server?forum=msbuild

Tôi đã nhận thấy một nhược điểm nhỏ khi gỡ cài đặt gói này:

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Một số tính năng ngôn ngữ C # 6.0 mới nếu được sử dụng trong Chế độ xem (dự án MVC) sẽ không biên dịch. Nhiều quan điểm của tôi sử dụng dấu?. toán tử kiểm tra null để truy cập thuộc tính Model. Tất cả các lượt xem này hiện trả về lỗi trên ứng dụng MVC 5 được lưu trữ trên Godaddy của tôi.

Lỗi này xảy ra do Chế độ xem (theo mặc định) được biên dịch trong thời gian chạy bằng đường ống .NET (không được biên dịch trước).

Để giải quyết vấn đề này, chỉ cần bỏ chọn tùy chọn "Cho phép trang web được biên dịch trước có thể cập nhật được" trong cài đặt hồ sơ xuất bản của bạn. Điều này sẽ biên dịch trước các quan điểm của bạn và cho phép C # 6.0 (Phiên bản mới nhất của Trình biên dịch Roslyn) của bạn chạy như một nhà vô địch.

Chỉ muốn bất kỳ ai nhìn vào câu hỏi này đều biết sự phân chia của việc gỡ cài đặt nó và tại sao nó lại ở đó ngay từ đầu


Cảm ơn. Điều đó có nghĩa là toàn bộ trang web được biên dịch (bao gồm cả vb/cs/htmlcác tệp giao diện người dùng, vì vậy nó có thể không phải là một tình huống khả thi cho tất cả (phải biên dịch lại toàn bộ trang web cho các thay đổi giao diện người dùng "đơn giản" chạm vào chế độ xem). Ngoài ra, lần cuối tôi "đã xuất bản ", ngay cả với 'đầy đủ biên dịch' công tắc trên, nó sẽ vẫn sản xuất các exetập tin trong /bin/roslyn.....
EdSF

3
Chỉ muốn bất kỳ ai nhìn vào câu hỏi này đều biết sự phân chia của việc gỡ cài đặt nó và tại sao nó lại ở đó ngay từ đầu.
Donny V.

nếu bạn tạo các bài đăng lại với dữ liệu động, điều này sẽ phá vỡ trang web của bạn.
John Lord

9

Đã liên tục gặp sự cố này trong Visual Studio 2017 Community Edition, nơi không thể tạo lại dự án vì không thể xóa các tệp cũ hơn trong bin / roslyn. Dựa trên nhận xét Vàng của OP, bây giờ tôi giữ Trình quản lý tác vụ mở (Ctrl + Shift + Esc) và giết quá trình VBCS.exe. Các tệp vi phạm trong bin / roslyn hiện có thể bị xóa.


1

Một tính năng khác của nó là nó không yêu cầu các máy chủ xây dựng phải thực sự có các phụ thuộc trình biên dịch. Bạn gửi trình biên dịch bạn muốn sử dụng VỚI mã tới máy chủ xây dựng và nó chỉ sử dụng chính xác những gì bạn đã yêu cầu.


1
Cảm ơn mặc dù bối rối về điều này. Các exetrong bin/roslynđược tạo ra như một phần của "xuất bản" một ứng dụng Asp.Net ( đã biên soạn / xây dựng).
EdSF

1
Các thành phần Roslyn cũng đi vào nguồn thông qua tham chiếu và gói nugget để chúng có thể được sử dụng cho tòa nhà, những thứ trong thùng mà tôi tin rằng được sử dụng cho bất kỳ thứ gì JIT'd (Razor) và cũng để chuyển từ MSIL sang bản địa trên hệ thống đang chạy ứng dụng.
Paul Swetz

0

Bản phát hành này của Visual Studio chứa một phiên bản mới của mã trình biên dịch C # & VB.net có tên là “Roslyn”.

Roslyn là bản viết lại hoàn chỉnh các trình biên dịch C # và VB.net với mỗi trình biên dịch được viết bằng ngôn ngữ tương ứng của chúng, ví dụ như trình biên dịch C # được viết bằng C # chứ không phải C ++. Roslyn là mã nguồn mở (Roslyn trên GitHub) nên về mặt lý thuyết, bạn có thể tạo phiên bản C # hoặc VB.net của riêng mình!

Điều gì sẽ trở thành Roslyn, được đề cập lần đầu tiên vào năm 2008 bởi Anders Hejlsberg tại hội nghị PDC tuy nhiên phải đến năm 2011, bản xem trước đầu tiên mới được phát hành.

Bạn có thể tham khảo các liên kết sau để có thêm thông tin chi tiết về vấn đề của bạn.

https://gooroo.io/GoorooTHINK/Article/16253/Visual-Studio-2015-and-Roslyn-Compiler/17944#.VmkfwjaheM8

https://visualstudiomagazine.com/articles/2012/03/20/10-questions-10-answers-on-roslyn.aspx

Từ: https://forums.asp.net/t/2079727.aspx?What+is+the+roslyn+folder+


Cảm ơn bạn. Tôi nghĩ "cái gì" đã rõ ràng, đó là "tại sao" và cụ thể hơn, tại sao lại cần một tệp thi hành ( exe) trong ngữ cảnh ứng dụng web, ngay cả khi ứng dụng web đã được biên dịch đầy đủ - nói cách khác, có " không có gì "còn lại trong thời gian chạy để biên dịch (mọi thứ đã được biên dịch trước ) - nơi việc loại bỏ / loại trừ toàn bộ thư mục roslyn đó chỉ là" tốt ".
EdSF

0

Hai điều cần lưu ý: 1) Xóa nó sẽ "khắc phục" sự cố, nhưng nó "sửa" nó bằng cách quay trở lại trình biên dịch cũ, được tích hợp sẵn, không tương thích với các tính năng ngôn ngữ sau này.
2) Không thể biên dịch trước trong nhiều trường hợp. Bạn sẽ hiển thị thông tin trong một mô hình như thế nào nếu nó được biên dịch trước và sau đó hiển thị các thay đổi đối với dữ liệu đó? Bất kỳ dữ liệu nào bạn dựa vào trong các chế độ xem từng phần để làm mới sẽ không bao giờ cập nhật.

Một điểm quan tâm khác là đảm bảo rằng bạn đang theo dõi thư mục "xây dựng" trong gói của roslyn. Nếu bạn không làm vậy, nó sẽ không gặp lỗi nhưng nó sẽ không biên dịch trang web của bạn khi bạn cố gắng tải nó. Được theo dõi đầy đủ, nó chỉ hoạt động. Chúng tôi đã triển khai nó cho các hệ thống phát triển khác mà không cần cài đặt nó trên các hệ thống đó trước và điều này có thể thực hiện được vì nó là một gói NuGet.


Trừ khi những tính năng đó là quan trọng, dự phòng không thực sự là một vấn đề.
EdSF

Đối với # 2, không chắc bạn muốn nói gì - ngoài nhu cầu biên dịch lại đã nêu cho tất cả các thay đổi nguồn, không có bất kỳ vấn đề nào khác.
EdSF

bất kỳ tính năng ngôn ngữ nào cũng có thể hoạt động được. Các ví dụ khiến chúng tôi muốn cập nhật sẽ là các toán tử null? và ??. Nó sạch hơn để nói đối tượng?. Giá trị ?? 0 so với if (object == null || object.value == null) 0 else object.value.
John Lord

đối với # 2, điều tôi đang nói là bạn không thể biên dịch trước bất kỳ thứ gì có dữ liệu động. Giả sử tôi đang hiển thị "thông tin tài xế". Tôi sẽ biên dịch trước nó như thế nào? Tôi không biết trước đó là trình điều khiển nào. Tôi cho rằng bạn có thể lấy dữ liệu sau đó bằng jquery nhưng điều đó thường là không cần thiết. Nếu trang của bạn có mô hình trên đó, bạn không thể biên dịch trước.
John Lord

# 2 Không. Không có sự khác biệt về "chức năng" với việc (trước) biên dịch toàn bộ ứng dụng của bạn hơn là không. Tất cả các chức năng xây dựng động mô hình của bạn (đầu vào của người dùng, v.v.) đều chạy như cũ.
EdSF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.