2009-07-11 33 views
5

Tham khảo "Trình quản lý cấu hình" trong trình đơn Xây dựng,C# - Visual Studio 2008 có khả năng biên dịch có điều kiện?

Có cách nào để nhận xét mã C# của tôi không? nó đến chế độ phát hành?

Tại sao tôi muốn điều này? Lý do mà tôi muốn có mã sẽ được biên dịch trong chế độ phát hành nhưng không phải trong Debug là tôi đã có một số mã sẽ không hoạt động từ PC phát triển của tôi (mã gửi email từ máy chủ của tôi, v.v ...).

Thay vì phải chạy lại mã của tôi và các dòng ghi chú trước khi xuất bản, tôi muốn điều đó là tự động.

+0

Cụm từ bạn đang tìm kiếm trong "biên soạn có điều kiện". – Richard

+2

Từ bản cập nhật của bạn, tôi nghĩ rằng biên dịch có điều kiện không thực sự là những gì bạn muốn. Đó là những gì bạn đang yêu cầu, nhưng không phải những gì bạn cần. Bạn cần một cấu hình chạy cho môi trường DEV của bạn, một cấu hình khác trong QA và một cấu hình khác trong Sản xuất. Tôi thực sự sẽ hướng tới một cấu hình hoặc giải pháp hướng đối tượng cho việc này. –

+0

Ahhhhh, "Compilation Compitional" ... hoàn toàn không thể nghĩ ra thuật ngữ đó. – Chaddeus

Trả lời

10

Bạn đang tìm kiếm một cái gì đó như thế này?

#if DEBUG 
    Console.WriteLine("Debug Mode"); 
#else 
    Console.WriteLine("Release Mode"); 
#endif 

Nếu bạn chỉ quan tâm đến chế độ phát hành, bạn có thể sử dụng:

#if !DEBUG 
    Console.WriteLine("Release Mode"); 
#endif 
+2

Tôi sẽ nói cùng một vấn đề áp dụng cho giải pháp này là của tôi. Tôi sẽ không giới thiệu nó. Tôi sẽ đề nghị xem xét vấn đề như một toàn thể và xem nếu có một số cách khác để giải quyết vấn đề lớn hơn. Có rất nhiều câu lệnh #if hoặc các thuộc tính có điều kiện đang xả rác mã của bạn là một cách chắc chắn để tạo ra nhiều sự nhầm lẫn cho bất kỳ lập trình viên bảo trì nào (hoặc thậm chí bản thân bạn trong một vài tháng!) –

+2

Tại sao bạn cho rằng biểu tượng DEBUG đang được sử dụng sai ? Nó được thêm vào theo mặc định cho mọi dự án và khung công tác ở đó để sử dụng nó, vì vậy chắc chắn nó được dự định sẽ được sử dụng. Tôi thấy nó hơi khác thường khi bạn chỉ biên dịch mã trong chế độ phát hành và không phải chế độ gỡ lỗi (thường là cách khác), nhưng biên dịch mã khác nhau giữa chế độ phát hành và chế độ gỡ lỗi là một tính năng hữu ích và có chủ ý của môi trường. – BlueMonkMN

+0

Không có gì sai với cờ biên dịch có điều kiện không thường xuyên. Tôi đồng ý khi bạn thấy nhiều hơn một số ít nó gây nhầm lẫn, mặc dù –

10

Bạn có thể sử dụng thuộc tính điều kiện về phương pháp (nhưng không phải dòng riêng lẻ của code) cho mục đích này

ví dụ Sau đây sẽ chỉ được biên dịch thành các bản dựng DEBUG.

[Conditional("DEBUG")] 
public void MyMethod() 
{ 
    // Do Stuff 
} 

Biểu tượng DEBUG đã được chỉ định trong cài đặt dự án. Bạn sẽ phải tạo ra biểu tượng của riêng bạn cho một thông cáo xây dựng, nói "CHÍ", vì vậy mà bạn có thể làm điều này:

[Conditional("RELEASE")] 
public void MyMethod() 
{ 
    // Do Stuff 
} 

Tuy nhiên, tôi khuyên bạn nên lùi lại và nhìn vào vấn đề của bạn một lần nữa từ một cao hơn mức độ như tôi sẽ không thực sự khuyên bạn nên giải pháp này.

+1

Không phải là một giải pháp trực tiếp cho những gì tôi muốn, nhưng tốt để biết. Cảm ơn bạn. – Chaddeus

-3

Tôi có thể sai, nhưng tôi nghĩ rằng các bình luận bị bỏ qua bởi trình biên dịch. Nếu tôi nhìn vào một hội đồng của tôi bằng cách sử dụng .NET Reflector, tôi không thấy bất kỳ nhận xét nào mà tôi biết tồn tại.

Phương pháp của BlueMonkMN sẽ hoạt động để chạy mã khác nhau tùy thuộc vào chế độ biên dịch.

Nếu bạn muốn chạy mã khác nhau tùy thuộc vào chế độ biên dịch nào (và các biến khác) bạn đang sử dụng, hãy xem PostSharp. Đó là một trình biên dịch sau khi biên dịch có thể thêm và loại bỏ mã cho assembly của bạn.

Ví dụ sử dụng: - I yêu cầu để có thông tin chi tiết về lỗi và theo dõi cho các dự án của tôi. - Tôi ghét có tuyên bố print hoặc trace.write sau mỗi kết quả phương pháp hoặc cuộc gọi phương thức, vì mã gỡ lỗi bổ sung này che khuất chức năng đang thực hiện công việc.

Bạn có thể định cấu hình PostSharp để tạo thông tin gỡ lỗi bổ sung này một cách linh động! Một vài tinh chỉnh cấu hình và bạn có thể có mọi cuộc gọi đến mọi chức năng được in VÀ kết quả (với nội dung biến đổi) từ mỗi cuộc gọi. Điều này làm cho nó rất dễ dàng để theo dõi luồng logic của chương trình.

+0

Đọc lại câu hỏi. Anh ta muốn biên dịch có điều kiện nhưng không biết nó tồn tại. –

4

Tôi sẽ cố gắng giải quyết vấn đề của bạn bằng kỹ thuật hướng đối tượng. Sử dụng dependency injection, tôi sẽ xây dựng một lớp thực hiện các hành động Gỡ lỗi cần thiết của bạn.

Cái gì như:

public class MyClass { 

    public MyClass(IDoOtherStuff stuffToDo) { 
     DoOtherStuff = stuffToDo; 
    } 

    private IDoOtherStuff DoOtherStuff { get; set; } 

    public void Do() { 
     DoOtherStuff.BeforeDo(); 

     // Blah blah blah.. 

     DoOtherStuff.AfterDo(); 
    } 
} 

public interface IDoOtherStuff { 
    void BeforeDo(); 
    void AfterDo(); 
} 

public class DebugOtherStuff : IDoOtherStuff { 
    public void BeforeDo() { 
     Debug.WriteLine("At the beginning of Do"); 
    } 

    public void AfterDo() { 
     Debug.WriteLine("At the end of Do"); 
    } 
} 

public class ReleaseOtherStuff : IDoOtherStuff { 
    public void BeforeDo() { } 
    public void AfterDo() { } 
} 

Bây giờ, bạn có thể sử dụng một container Inversion of control như Windsor, Unity, Ninject, hoặc Spring.NET để cấu hình môi trường phát triển của bạn so với môi trường phát hành.

+0

+1 cho DI như một giải pháp, mặc dù có thể không phải là cách phù hợp cho vấn đề này, tôi tin rằng đó là một cái gì đó là câu trả lời cho hầu hết các vấn đề biên dịch có điều kiện ... và cũng giải thích rất tốt. – Martin

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