Nhắm mục tiêu lại tất cả các dự án trong một giải pháp cho .NET 4.5.2


96

Tôi có một giải pháp trong Visual Studio 2012 với 170 dự án C # trong đó. Tôi cần nhắm mục tiêu lại tất cả các dự án từ .NET Framework 4.0 đến 4.5.2.

Tôi muốn để Visual Studio xử lý việc này bằng cách đi vào các thuộc tính của từng dự án, thay đổi khung được nhắm mục tiêu và cho phép Visual Studio thực hiện bất kỳ thay đổi cần thiết nào đối với tệp .csproj.

Tôi nhận thấy rằng những thay đổi này bao gồm việc thêm một vài thẻ XML mới vào .csproj, tùy thuộc vào một số thuộc tính của dự án hiện tại.

Làm cách nào để tôi có thể nhắm mục tiêu lại hàng loạt tất cả 170 dự án C # mà không chỉ sử dụng công cụ văn bản thay thế để thay thế số phiên bản được nhắm mục tiêu? Tôi muốn Visual Studio thực hiện tất cả các sửa đổi và bổ sung thẻ cần thiết và chỉ thay thế sẽ không cho phép điều đó xảy ra.


Tôi không biết có cách nào để thực hiện việc này một cách tự động .. Tôi nghĩ cách tốt nhất của bạn sẽ là một trình ghi macro windows tiêu chuẩn, mà bạn sử dụng các lệnh bàn phím .. Nhưng, tôi sẽ thực hiện từng lần một thay vì cố gắng nhập hàng loạt chúng vì có thể khó xác định khi nào VS hoàn thành công việc của mình trong mọi trường hợp.
Erik Funkenbusch

1
Không, bạn không nên làm điều này. Đặc biệt là không phải 4.5.2, nó không có các loại mới hữu ích và không có khả năng được bao phủ bởi các gói đa mục tiêu trong tương lai. Giống như 4.0x thì không. Thực hiện từng dự án một và chỉ những dự án cần nó. Những cái mà bạn thực sự muốn thêm một tổ hợp tham chiếu mới và sửa đổi mã để sử dụng chúng. Nếu bạn muốn bỏ qua lời khuyên này, bạn có thể làm vậy, sau đó sử dụng Edit> Find and Replace> Replace in Files để thay thế phần tử TargetFrameworkVersion trong các tệp * .csproj. Đảm bảo kiểm soát nguồn của bạn chắc chắn.
Hans Passant

1
@HansPassant Giải pháp Tìm / Thay thế của bạn là chính xác những gì tôi không muốn làm theo câu hỏi của tôi. Tôi cần một giải pháp mạnh mẽ hơn.
Kyle V.

@GrantWinney Tôi / biết / nó sẽ không hoạt động vì tôi đã thử Tìm / Thay thế và nếu bạn sử dụng phương pháp đó thì các thay đổi .csproj bổ sung mà Visual Studio đã thực hiện sẽ không được triển khai.
Kyle V.

1
@GrantWinney, phần mở rộng Target Framework Migrator thực hiện chính xác những gì tôi muốn. Nếu bạn có thể tạo ra một câu trả lời, tôi sẽ đánh dấu nó chính xác. Cảm ơn!
Kyle V.

Câu trả lời:


84

Tài liệu MSDN " Hướng dẫn Di chuyển sang .NET Framework 4.5 " và " Cách định cấu hình ứng dụng để hỗ trợ .NET Framework 4 hoặc 4.5 " chỉ thảo luận về việc sửa đổi các dự án. Không có chi tiết nào về việc áp dụng các thay đổi cho toàn bộ giải pháp cùng một lúc, cũng như tôi chưa thấy một chức năng nào trong VS hỗ trợ nó.

Tuy nhiên, có một tiện ích mở rộng (được đánh giá tốt) có tên Target Framework Migrator có sẵn trong thư viện Visual Studio, hỗ trợ nâng cấp lên 4.5.2 (cũng như các phiên bản mới hơn **) và có vẻ như nó sẽ làm chính xác những gì bạn muốn. Mã nguồn có sẵn trên GitHub , nếu bạn quan tâm.

Lưu ý rằng việc thiếu một tính năng như vậy có thể là cố ý (và không chỉ là một thiếu sót). Tôi chỉ đoán, nhưng có lẽ số liệu của MS chỉ các dự án cần các Khung công tác mới sẽ được nâng cấp. FWIW, nếu bạn kết thúc việc nâng cấp một số dự án được chia sẻ với các giải pháp khác, các giải pháp đó có thể không xây dựng được cho đến khi chúng cũng được nâng cấp.

Điều đó đang được nói, nếu bạn đang ở trong một cửa hàng nhỏ với chỉ một (hoặc một vài) giải pháp và bạn đang tìm cách nâng cấp mọi thứ trong một lần, thì có lẽ công cụ trên sẽ phù hợp với bạn.


Không có sự phát triển nào về vấn đề này trong nhiều năm và rõ ràng là nhà phát triển không có kế hoạch chuyển giao chiếc dùi cui cho bất kỳ ai khác.

Nếu bạn không thể có được nó để làm việc với một phiên bản .NET Framework mới hơn, kiểm tra hiện PRsvấn đề cho sửa chữa, nhưng bạn có thể phải áp dụng chúng cho mình. Ví dụ: ai đó đã đăng bản sửa lỗi cho .NET Framework v 4.7.1 . Hy vọng rằng chúng sẽ được hợp nhất, nhưng tôi sẽ không nín thở.

Nếu bất kỳ ai khác gặp lỗi tương tự như Anas (trong các nhận xét), đây là sự cố GitHub từ một vài tuần trước và một sự cố khác có thể liên quan từ năm 2017. Hãy xem xét việc nhấn mạnh họ và thêm các chi tiết khác nếu bạn đang gặp phải vấn đề tương tự .


7
Công cụ "bộ di chuyển khung mục tiêu" không thành công trên bản cập nhật VS 2017 mới nhất 15.5.5, "Tham số không hợp lệ"
Anas Ghanem

1
Làm việc cho tôi ngày hôm nay với VS2017 15,7 đến Khung 4.7
Tod

Tôi rất nghi ngờ rằng MS cố tình bỏ qua các tính năng vì lợi ích của người dùng ... nhiều khả năng đó chỉ là thứ khác mà họ không nghĩ đến hoặc không cần phải hỗ trợ ... chuyển nó cho cộng đồng ..
PJUK

1
@Grant Tôi đã thêm nhận xét vào vấn đề hiện có. Tôi thực sự đã thực hiện công việc với tìm kiếm find / sed và thay thế trong các tệp dự án và cấu hình.
JB. Với Monica.

2
Nhà phát triển đã vượt qua baton vào tháng 12 năm 2019, bạn có thể chỉnh sửa lại câu trả lời (hay) của mình :)
Ludovic Feltz

12

Đối với giải pháp .NET Framework, " Thay thế trong tệp " đơn giản đã giúp tôi giải quyết vấn đề:

ví dụ : Từ .NET Framework 4.5.2 đến .NET Framework 4.7.2

Trong tệp package.config , hãy thay thế tất cả

targetFramework="net452" 

đến

targetFramework="net472" 

Trong các tệp * .csproj , hãy thay thế tất cả

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

đến

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

1
Trong VS 2019, "thay thế tất cả" không hoạt động. Bạn phải liên tục sử dụng "tìm tiếp theo." Đây là dự án phát triển dựa trên Microsoft cuối cùng của tôi. Tôi đang chuyển sang MacOSX nơi có tính nhất quán và mức độ QA tốt được thực hiện trên các sản phẩm của họ.
ATL_DEV

1
Thay đổi targetFramework trong package.config không cài đặt lại gói cho khung đó, vì vậy bạn vẫn có thể gặp phải phiên bản sai. Bạn sẽ phải cài đặt lại gói hoặc ít nhất là xóa thư mục gói của bạn và khôi phục phiên bản phù hợp của gói. Vấn đề là với mô hình package.config cũ đó, nếu không cài đặt lại, bạn sẽ tham chiếu dll cho gói sẽ nhắm mục tiêu sai dll trong thư mục con sai của gói.
Triynko

3
Chà, cuối cùng lại quay lại câu hỏi này một lần nữa sau kỳ nghỉ và cũng thấy cần phải bình luận về câu trả lời tương tự này, haha. Tôi sẽ nói thêm rằng các tệp * .csproj và package.config không phải là những thứ duy nhất tham chiếu đến khung mục tiêu. Ngoài ra còn có các tham chiếu trong tệp web.config trong các phần khác nhau. Ví dụ: trong system.web, thẻ compilation và httpRuntime có thuộc tính targetFramework cần được cập nhật. Vì vậy, quy trình thủ công 'tìm và thay thế' này có vẻ như là một ý tưởng thực sự khủng khiếp có thể khiến các dự án của bạn ở trạng thái không nhất quán và bị hỏng.
Triynko

9

Target Framework Migrator bị hỏng, tôi đã tự tìm kiếm / thay thế (sử dụng git bash, nó hoạt động tốt trên windows); Về cơ bản, nó thay đổi v4.6.x thành v4.7.2 , sau đó nó chuyển đổi trở lại các tệp để sử dụng CRLF khét tiếng của DOS:

find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.6\..' \{} \; | xargs -0 sed -i 's/v4\.6\../v4.7.2/'  
find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.7\..' \{} \; | xargs -0 unix2dos

4
Tôi đã tìm thấy điều này, và sau đó là một Update-Package -ReInstallđiều kỳ diệu. Cảm ơn!
askrich

1
Điều này hoàn toàn tốt cho tôi. Cảm ơn bạn đã giải pháp này
Maryam

Đối với phiên bản powershell, hãy xem stackoverflow.com/a/2837891/463425
tkerwood

7

Tôi đã tự xây dựng cho mình một công cụ đơn giản để di chuyển các phiên bản khung mục tiêu cho toàn bộ giải pháp, vì Phần mở rộng Target Framework Migrator không hỗ trợ Visual Studio 2017. Tải xuống công cụ từ kho lưu trữ GitHub của tôi https://github.com/Xpitfire/TargetFrameworkMigrator

Tôi biết đây không phải là cách tốt nhất để đi, nhưng nó đã hiệu quả với tôi và có thể nó cũng sẽ giúp ích cho người khác.


Chắc chắn là bây giờ.
Jay Croghan

3

Target Framework Migrator khá hữu ích. Theo mặc định, nó có phiên bản v4.7. Tuy nhiên, thật dễ dàng để thêm hỗ trợ cho v4.7.1, v4.7.2 và v4.8.

Tìm tệp Frameworks.xml trong thư mục C: \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ và chỉnh sửa bằng cách thêm các phiên bản khung sau:

<Framework Id="262152" Name=".NETFramework,Version=v4.8"/>
<Framework Id="262663" Name=".NETFramework,Version=v4.7.2"/>
<Framework Id="262407" Name=".NETFramework,Version=v4.7.1"/>

Sau khi khởi động lại visual studio, bạn sẽ thấy các phiên bản mới.


2
Có một bản fork tương thích với VS2019 đã được cập nhật tại github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS

Cảm ơn rất nhiều! Đây là một cách giải quyết rất hay và dễ dàng!
sáp nhập

2
public void ChangeFramework() {

  //Add Reference to envdte (Assemblies\Extensions\envDTE)
  string SolutionFile = @"C:\MyProject\MyProject.sln";
  string ProjectName = "MyProject";

  //------------------------------------------------------------------------
  //Find the Program ID from the registry for VisualStudio.DTE
  //Look it up In Registry: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes
  System.Type oType = System.Type.GetTypeFromProgID("VisualStudio.DTE", true);
  EnvDTE.DTE dte = (EnvDTE.DTE)Activator.CreateInstance(oType, true);

  //------------------------------------------------------------------------
  //Open your Solution
  dte.Solution.Open(SolutionFile);

  //------------------------------------------------------------------------
  //Now In your solution go through what is listed in dte.Solution.Projects 
  //and find the one that match what you want to change target for
  int iItemsCount = dte.Solution.Projects.Count;
  string sCurrent = "";

  for (int i = 1; i <= iItemsCount; i++) {

    sCurrent = dte.Solution.Projects.Item(i).Name;

    if (dte.Solution.Projects.Item(i).Name == ProjectName) {
      //Once you find your project, Change the Framework
      EnvDTE.Project oProject = dte.Solution.Projects.Item(i);
      oProject.Properties.Item("TargetFrameworkMoniker").Value = ".NETFramework,Version = v4.6.2";
    }
  }

  //------------------------------------------------------------------------
  //Close your Solution
  dte.Solution.Close();
}
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.