2009-06-12 27 views
5

Có ai biết về một tiện ích để xử lý trước một tệp nguồn C# mà không biên dịch nó, theo cách tương tự để sử dụng cờ -E trong GCC không? Tôi đã thử sử dụng GCC - nó xử lý thành công các chỉ thị #if, nhưng nó xử lý các chỉ thị #region ...Công cụ xử lý trước C# có tồn tại không?

Lý tưởng nhất, tôi muốn có thể chạy công cụ trên tệp .cs để xóa bất kỳ #if khối đánh giá nào thành false và tùy chọn có thể gắn cờ để xóa/để lại các nhận xét còn nguyên vẹn, #region, #pragma chỉ thị, v.v.

Để đặt điều này trong ngữ cảnh, tôi muốn có thể xuất bản một số mã nguồn là một phần của (nhiều) dự án lớn hơn, trong khi loại bỏ các phần chỉ liên quan đến dự án lớn hơn. Như một ví dụ, có những khối mã mà trông như thế này:

#if (SUBPROJECT) 
namespace SubProject 
#else 
namespace CompleteProject 
#endif 
{ 
    public class SomeClass() 
    { 
#if (!SUBPROJECT) 
    // This might call a method contained in an assembly that potentially 
    // won't be available to the sub-project, or maybe a method that hooks 
    // into a C library via P/Invoke... 
    string result = CallSomeCleverMethod(); 
#else 
    // This might call a method that performs a simplified version of the 
    // above, but does so without the above's assembly or P/Invoke 
    // dependencies... 
    string result = CallSomeSimpleMethod(); 
#endif 
    } 
} 

Hãy nhớ tôi không cố gắng để làm xây dựng ở đây - đây là thuần túy về xuất bản chỉ là một tập hợp con của mã nguồn một dự án lớn hơn của.

Bất kỳ ý tưởng/trợ giúp nào được đánh giá cao.

Trả lời

3

Hóa ra bằng cách sử dụng bộ tiền xử lý GNU C (cpp) trực tiếp (thay vì thông qua gcc) cung cấp khả năng kiểm soát đầu ra nhiều hơn. Sử dụng này, tôi đã có thể xử lý các tập tin nguồn trong một thời trang phù hợp ...

Dưới đây là một ví dụ:

cpp -C -P -DSUBPROJECT Input.cs Output.cs 

tôi đã cố gắng để có được C/C++ cung cấp với Visual Studio để làm điều gì đó tương tự , nhưng đã từ bỏ sau một thời gian ...

+0

Tôi có thể nhận được tệp thi hành ở đâu? – NightOwl888

+0

Đó là một phần của bộ sưu tập trình biên dịch GNU - nó có thể đã được cài đặt nếu bạn đang chạy OS X hoặc Linux. Nếu bạn đang chạy Windows, MinGW có lẽ là những gì bạn cần. –

+0

Tôi đã tìm thấy một ứng dụng hoạt động tại đây: http://mcpp.sourceforge.net/download.html, nhưng tệp thực thi là mccp chứ không phải là cpp. – NightOwl888

1

Có thể không dễ dàng hơn và C#, để tạo giao diện và có các triển khai khác nhau của các giao diện đó? Một bộ mà bạn có thể đóng gói dưới dạng thư viện và phân phối lại?

+0

Tôi cần để có thể xử lý tên lớp/không gian tên thực, siêu dữ liệu (thuộc tính tùy chỉnh v.v.) - xem ví dụ về không gian tên trong câu hỏi. Tôi cũng không muốn thêm phức tạp triển khai vào nơi không cần thiết. –

+2

Bạn không nghĩ rằng mã trên đã phức tạp?Tôi vẫn nghĩ rằng bạn đang thực sự đến từ điều này từ một tư duy C + + và có thể thiếu một số công cụ mà C# cung cấp, nhưng tốt nhất của may mắn tìm kiếm một giải pháp mà sẽ làm cho bạn hạnh phúc! –

2

Tôi không biết về bộ tiền xử lý cho C# cho phép bạn xuất một tập hợp con mã nguồn của bạn mà không cần xây dựng nó.

Tuy nhiên, bạn sẽ có thể đạt được hiệu quả tương tự bằng cách sử dụng mẫu tạo mã. Chỉ cần thay đổi để các preprocesor chỉ thị tương ứng với mẫu tương ứng.

Visual Studio 2008 có công cụ tạo mã tích hợp được gọi là T4. Có những lựa chọn của bên thứ ba khác như CodesmithTools hoặc miễn phí MyGeneration.Net

+1

Điều đó nghe có vẻ đầy hứa hẹn - Tôi đã không nghĩ về T4 - Tôi sẽ xem xét và báo cáo lại sớm .. –

2

Tôi không tin rằng có bất kỳ cờ cho csc hoặc MSC (biên dịch mono) để sản xuất các tập tin xử lý trước.

Nếu tôi phải làm điều này và đó là một tập con nhỏ tôi sẽ biên dịch và sau đó sử dụng Reflector để dịch ngược lại thành C# và xuất tệp. Nếu bạn có nhiều tệp, có một số Reflector Add-In được gọi là FileGenerator for Reflector.

Rất tiếc, đây sẽ không phải là bản sao mã nguồn của bạn - nó sẽ định dạng lại tất cả mã và bạn sẽ mất tất cả các nhận xét.

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