2011-06-28 19 views
26

Làm cách nào để xây dựng giải pháp C# theo lập trình? Tôi sẽ có thể vượt qua con đường của một giải pháp và nhận được các thông điệp đầu ra (hoặc chỉ cần xây dựng các giải pháp) làm thế nào để tôi đạt được điều này trong C#?Làm thế nào để xây dựng một giải pháp lập trình trong C#?

+0

Câu hỏi của bạn khá mơ hồ. Bạn có thể cho chúng tôi một đoạn mã giả về những gì bạn đang cố gắng thực hiện không? – Nix

+0

@Nix: Tôi nghĩ OP có nghĩa là "biên dịch mã khi chạy"? – Ryan

+0

Tại sao bạn cần điều này? Bạn đang cố gắng đạt được điều gì? Bạn có thể xây dựng các giải pháp từ dòng lệnh bằng cách sử dụng MSBuild nếu bạn không muốn xây dựng chúng thông qua Visual Studio. – Bernard

Trả lời

17

Hầu hết tất cả các bạn đang cung cấp cách để làm điều đó bằng cách gọi lệnh bên ngoài, nhưng có một api, Microsoft.Build.Framework, để xây dựng thông qua C#


Mã Từ Blog:

using Microsoft.Build.BuildEngine; 
using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 

public class SolutionBuilder 
{ 
    BasicFileLogger b; 
    public SolutionBuilder() { } 

    [STAThread] 
    public string Compile(string solution_name,string logfile) 
    { 
     b = new BasicFileLogger(); 
     b.Parameters = logfile; 
     b.register(); 
     Microsoft.Build.BuildEngine.Engine.GlobalEngine.BuildEnabled = true; 
     Project p = new Project (Microsoft.Build.BuildEngine.Engine.GlobalEngine); 
     p.BuildEnabled = true; 
     p.Load(solution_name); 
     p.Build(); 
     string output = b.getLogoutput(); 
     output += “nt” + b.Warningcount + ” Warnings. “; 
     output += “nt” + b.Errorcount + ” Errors. “; 
     b.Shutdown(); 
     return output; 
    } 
} 
//The above class is used and compilation is initiated by the following code, 
static void Main(string[] args) 
{ 
    SolutionBuilder builder = new SolutionBuilder(); 
    string output = builder.Compile(@”G:CodesTestingTesting2web1.sln”, @”G:CodesTestingTesting2build_log.txt”); 
    Console.WriteLine(output); 
    Console.ReadKey(); 
} 

Lưu ý mã trong blog đó hoạt động, nhưng hơi nhỏ ngày

Microsoft.Build.BuildEngine

đã được chia thành một số mảnh

Microsoft.Build.Construction

Microsoft.Build.Evaluation

Microsoft.Build.Execution

+2

trông giống như "Tự động biên dịch của Visual Studio dự án thông qua C# bằng cách sử dụng MSBuild" liên kết bị hỏng –

+2

Thông tin này là lỗi thời - nếu bạn sử dụng lớp Engine, bạn sẽ nhận được cảnh báo này: "Lớp này đã không được chấp nhận. sử dụng Microsoft.Build.Evaluation.ProjectCollection từ hội đồng Microsoft.Build thay thế. Vì vậy, câu trả lời dưới đây bằng cách sử dụng Project và ProjectCollection là câu trả lời đúng. – crimbo

0

Chắc chắn bạn có thể sử dụng msbuild để xây dựng bất kỳ tệp giải pháp Visual Studio nào.

Tôi tin rằng bạn có thể sử dụng Process.Start để gọi msbuild với các thông số thích hợp.

4
// Fix to the path of your msbuild 
var pathToMsBuild = "C:\\Windows\\DotNet\\Framework\\msbuild.exe"; 

Process.Start(pathToMsBuild + " " + pathToSolution); 
+0

cảm ơn bạn Justin tôi sẽ kiểm tra điều này quá :) –

2

Bạn có thể tạo một tập tin .proj:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <!-- Common --> 
    <Solution Include="Common\Util\Util.sln"/> 
    <Solution Include="Common\EventScheduler\EventSchedulerSolution\EventSchedulerSolution.sln"/> 
    <!-- Server --> 
    <Solution Include="Server\DataLayer\DataTransferObjects\SharedModel\SharedModel.sln"/> 
    <Solution Include="Server\DataLayer\DataTier\ESPDAL.sln"/> 
    <!-- Internal Tools --> 
    <Solution Include="InternalTools\ServerSchemaUtility\ServerSchemaUtility.sln"/> 
    </ItemGroup> 
    <Target Name="Rebuild"> 
    <MSBuild Projects="@(Solution)" Targets="Rebuild" Properties="Configuration=Release"/> 
    </Target> 
</Project> 

và sau đó gọi msbuild.exe bằng cách sử dụng tệp proj làm đối số, dưới đây là ví dụ về tệp lô. Từ C#, bạn có thể gọi Process.Start như được chỉ định bởi các áp phích khác.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" BuildSolutions.proj 

pause 
27

Xem liên kết này cho một ví dụ sử dụng .NET 4.0 MSBuild API:

http://www.odewit.net/ArticleContent.aspx?id=MsBuildApi4&format=html

List<ILogger> loggers = new List<ILogger>(); 
loggers.Add(new ConsoleLogger()); 
var projectCollection = new ProjectCollection(); 
projectCollection.RegisterLoggers(loggers); 
var project = projectCollection.LoadProject(buildFileUri); // Needs a reference to System.Xml 
try 
{ 
    project.Build(); 
} 
finally 
{ 
    projectCollection.UnregisterAllLoggers(); 
} 

Một ví dụ đơn giản:

var project = new Project(buildFileUri, null, "4.0"); 
var ok = project.Build(); // or project.Build(targets, loggers) 
return ok; 

Hãy nhớ sử dụng .NET 4 Hồ sơ (không phải hồ sơ Khách hàng).

Thêm các tham chiếu sau: System.XML, Microsoft.Build, Microsoft.Build.Framework và tùy chọn Microsoft.Build.Utilities.v4.0.

Cũng xem ở đây:

running msbuild programmatically

Để xây dựng một giải pháp, làm như sau:

var props = new Dictionary<string, string>(); 
props["Configuration"] = "Release"; 
var request = new BuildRequestData(buildFileUri, props, null, new string[] { "Build" }, null); 
var parms = new BuildParameters(); 
// parms.Loggers = ...; 

var result = BuildManager.DefaultBuildManager.Build(parms, request); 
return result.OverallResult == BuildResultCode.Success; 
1

Nếu bạn cần Tigger xây dựng từ Visual Mã mở rộng Studio, bạn phải xem xét các hạn chế được áp đặt bởi giao diện IVsBuildManagerAccessor - xem Ghi chú chung Bao gồm IVsBuildManagerAccessor.docx mới từ Managed Package Framework for Projects. Đó là ngã ba cũng có sẵn tại github.

Trong Visual Studio 2010 với MSBuild 4.0, có tương tác mới giữa Giám đốc Giải pháp xây dựng và MSBuild mà dự án tác động hệ thống sử dụng các dịch vụ này. MSBuild 4.0 chứa thành phần mới được gọi là Trình quản lý Xây dựng (không bị nhầm lẫn với Trình quản lý Xây dựng Giải pháp là thành phần VS) kiểm soát việc gửi yêu cầu xây dựng . Điều này trở nên cần thiết khi Visual Studio 2010 hiện cho phép các bản dựng song song xảy ra (đáng chú ý là các dự án gốc) và truy cập vào các tài nguyên được chia sẻ như CPU ​​cần được dàn xếp. Đối với các hệ thống dự án mà trước đây được gọi đơn giản là Project.Build() đến , hãy gọi một số thay đổi phải được thực hiện. Hệ thống dự án bây giờ phải:

  1. Yêu cầu dịch vụ SVsBuildManagerAccessor sử dụng giao diện IServiceProvider. Việc này nên được thực hiện ngay sau khi hệ thống dự án được tải, trước khi bất kỳ bản dựng nào có thể xảy ra.
  2. Thông báo cho hệ thống nếu bạn cần chuỗi giao diện người dùng
  3. Thông báo cho hệ thống nếu bạn đang xây dựng theo thời gian thiết kế.
  4. Đăng ký nhật ký bằng Trình quản lý Trình quản lý Xây dựng.
  5. Gửi yêu cầu xây dựng trực tiếp đến Trình quản lý xây dựng MSBuild, thay vì gọi phương thức trên Dự án.