2013-06-14 39 views
12

Tôi sử dụng CSharpCodeProvider để biên dịch các plugin tức thì cho ứng dụng của mình.Số lỗi tối đa trong CSharpCodeProvider.CompileAssemblyFromFile

Hiện tại, bạn có thể thử biên dịch một tệp, có vẻ tốt, nhưng tạo nhiều lỗi, ví dụ mã C# được dán với tệp nhị phân. Có nhiều ký tự, được xử lý với error CS1056: Unexpected character.

Hành vi này được mong đợi, nhưng quá trình biên dịch tệp "độc hại" này tốn rất nhiều thời gian.

Một giải pháp mà tôi thấy hợp lý là giới hạn số lỗi, sau đó trả về số tiền CSharpCodeProvider.CompileAssemblyFromFile.

Có thể đặt giới hạn như vậy không?

Tôi thực sự không muốn kiểm tra tệp cẩn thận ngay từ đầu, nếu có thể tránh được.

+2

nếu có * ngay cả một nguy cơ từ xa * mà tệp đến là độc hại, cá nhân tôi sẽ không tin tưởng nó đủ thậm chí để cho nó gần một trình biên dịch; có một số trường hợp thú vị (Eric Lippert sẽ có một danh sách, không nghi ngờ gì) của những thứ trong * hợp lệ-tìm kiếm * C# đó là không cân xứng đắt tiền cho trình biên dịch để cố gắng tìm ra –

+0

@MarcGravell: Đặc biệt, kết hợp khó chịu của độ phân giải quá tải với suy luận kiểu (xem bài đăng trên blog của Eric Lippert về 3SAT). Tuy nhiên, thiết lập một thời gian chờ khó khăn trên quá trình biên dịch sẽ làm cho nó an toàn. – SLaks

+0

@MarcGravell - bạn có một điểm hợp lệ, nhưng, tốt, tôi _do_ muốn có thể tải một tập tin và thử. Tôi biết nó có thể nguy hiểm, nhưng, tốt, đó thực sự là những gì tôi muốn. –

Trả lời

1

Tôi không biết liệu có thuộc tính hoặc lĩnh vực của CSharpCodeProvider có thể kiểm soát điều này hay không, nhưng một giải pháp có thể là thay đổi câu hỏi mà bạn đang hỏi - nếu vấn đề là thời gian cần để biên dịch, thay vì số lỗi, giải pháp của tôi là chạy CSharpCodeProvider trên một nhiệm vụ riêng biệt, nhưng hãy hủy nhiệm vụ nếu quá trình này mất quá nhiều thời gian để hoàn thành.

Sau đó, bạn có thể cung cấp thông báo lỗi của riêng mình:

"Mã của bạn quá xấu. Không thể biên soạn trong chưa đầy 5 phút". : P

Vì lý do bảo mật, bạn có thể thử chạy mọi thứ trong một AppDomain riêng biệt qua Application.Run? Dunno làm thế nào phức tạp ứng dụng của bạn, nhưng bạn có thể bắt đầu một trường hợp mới của hình thức chính của bạn với các plugin tiêm.

+0

Làm cho tinh thần, nhưng không thực sự giải quyết vấn đề của tôi.Tôi muốn có một thông tin về các lỗi đã gặp cho đến nay (ít nhất là lỗi đầu tiên) –

+0

Theo như tôi có thể nói, cách duy nhất để có được lỗi của một trình biên dịch được thực hiện bởi một cá thể CSharpCodeProvider là thuộc tính Lỗi của CompilerResults được trả về SAU nó biên dịch mọi thứ. Một cách tôi có thể suy nghĩ để kiểm tra giá trị DURING compilation là sử dụng sự phản chiếu để lấy trường cơ sở của thuộc tính Errors đó (giả sử bạn có thể theo dõi đối tượng CompilerResults, có khả năng được xây dựng khi CompileAssemblyFrom * được gọi). Có lẽ, trường đó sẽ là một loại bộ sưu tập, vì vậy bạn có thể kết thúc tác vụ nếu nó được thêm vào và nhận được những gì được thêm vào nó để hiển thị trong các lỗi của bạn. –

+0

Điều đó sẽ rất chậm, phản ánh mã đang được thực hiện và thậm chí có thể không thể thực hiện được trên các chuỗi riêng biệt. Nó cũng rất đáng sợ. Vui lòng cập nhật câu hỏi này nếu bạn tìm thấy câu trả lời hay hơn - tôi rất tò mò vì tôi đã thực hiện tất cả nghiên cứu này để thử và trả lời;) –

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