2009-11-17 21 views
5

Tôi hiện đang phát triển một ứng dụng mà bạn có thể tạo "chương trình" với nó mà không cần viết mã nguồn, chỉ cần nhấp vào & phát nếu bạn muốn.Tạo mã động

Bây giờ câu hỏi là làm thế nào để tôi tạo một chương trình thực thi từ mô hình dữ liệu của tôi. Có nhiều khả năng nhưng tôi không chắc cái nào là tốt nhất cho tôi. Tôi cần phải tạo ra các hội đồng với các lớp và không gian tên và tất cả mọi thứ có thể là một phần của ứng dụng.

  1. CodeDOM class: Tôi nghe nói về rất nhiều hạn chế và lỗi của lớp này. Tôi cần tạo thuộc tính về tham số phương thức và giá trị trả về. Điều này có được hỗ trợ không?

  2. Tạo mã nguồn C# theo chương trình và sau đó gọi CompileAssemblyFromFile trên đó: Điều này sẽ hoạt động vì tôi có thể tạo bất kỳ mã nào tôi muốn và C# hỗ trợ hầu hết các tính năng CLR. Nhưng điều này sẽ không chậm?

  3. Sử dụng lớp phản chiếu ILGenerator: Tôi nghĩ với điều này tôi có thể tạo mọi mã .NET có thể. Nhưng tôi nghĩ điều này phức tạp hơn và dễ bị lỗi hơn các phương pháp khác?

  4. Có các giải pháp khả thi nào khác không?

EDIT: Công cụ này là chung để phát triển ứng dụng, không bị giới hạn ở một miền cụ thể. Tôi không biết nếu nó có thể được coi là một ngôn ngữ lập trình trực quan. Người dùng có thể tạo các lớp, phương thức, các cuộc gọi phương thức, tất cả các loại biểu thức. Nó sẽ không bị giới hạn rất vì bạn có thể thực hiện hầu hết mọi thứ được phép bằng ngôn ngữ lập trình thực. Hiện tại rất nhiều thứ vẫn phải được người dùng viết dưới dạng văn bản, nhưng mục tiêu cuối cùng là, gần như mọi thứ đều có thể được nhấp cùng nhau.

+0

Bạn có thể đưa ra ví dụ về loại (s) của "chương trình" sẽ được tạo ra từ điều này không? –

+0

Tôi đã cập nhật câu hỏi, vui lòng xem chỉnh sửa của tôi. – codymanix

+0

Tôi vẫn không thể thực sự nhìn thấy những gì bạn đang cố gắng đạt được - nó giống như một DSL hay bạn đang cố gắng tạo ra một ngôn ngữ lập trình cấp cao có mục đích chung đang chạy trên C#? – glenatron

Trả lời

4

Bạn thấy mình rất đáng xem xét Dynamic Language Runtime được thiết kế nhiều hơn hoặc ít hơn để tạo ngôn ngữ cấp cao dựa trên .NET.

Có lẽ cũng đáng xem xét một số trong số Stack Overflow threads on Domain Specific Languages trước đây có chứa một số liên kết hữu ích cho các công cụ để làm việc với DSL, nghe có vẻ giống như những gì bạn đang lên kế hoạch mặc dù tôi vẫn chưa hoàn toàn rõ ràng mục tiêu là.

+1

Cụ thể, tôi khuyên bạn nên xem syml.doc (http://dlr.codeplex.com/Project/Download/FileDownload.aspx?DownloadId=74709) trên trang web DLR. Nó thực sự là một walktrough cho việc tạo ra ngôn ngữ đơn giản của riêng bạn bằng cách sử dụng Expression Trees và DLR. –

2

Hầu hết mọi thứ "nhấp và phát" phải đủ đơn giản chỉ để gắn một số đối tượng khối dựng sẵn được xác định trước (có thể sử dụng giao diện trên ranh giới). Có nghĩa là: bạn có thể không cần phải tạo mã động - chỉ cần "giả mạo nó". Ví dụ, sử dụng đối tượng sở hữu túi (như DataTable vv, mặc dù đó không phải là lựa chọn đầu tiên của tôi) cho các giá trị, vv

Một tùy chọn khác cho động đánh giá là lớp Expression; đặc biệt trong .NET 4.0, điều này cực kỳ linh hoạt, và cho phép biên dịch thành một đại biểu.

+0

Mặc dù chỉ cần nhấp và phát nhưng người dùng có thể tạo các lớp và thành viên thực sự cho nó, tôi cũng cần hiệu suất tốt, vì vậy tôi phải tạo mã "thực". Với các biểu thức tôi chỉ có thể tạo biểu thức, vì vậy tôi phải sử dụng nó cùng với codeDOM? – codymanix

+0

hoặc với cụm động. Tôi đã thực hiện ** rất nhiều ** của mã động, nhưng tôi đã không bao giờ được sử dụng codeDOM –

+0

Vì vậy, bạn đề nghị Expression và assemlies động như là thay thế cho codeDOM? Điều này có dẫn đến hiệu suất tương tự (thời gian chạy) không? Bạn có một liên kết web trên làm thế nào để tạo ra hội đồng theo cách này? – codymanix

0

Tùy thuộc vào yêu cầu của bạn, CodeDOM chắc chắn sẽ phù hợp nhất với "chương trình" được lưu trữ trong "mô hình dữ liệu".

Tuy nhiên, khả năng sử dụng tùy chọn 2 sẽ chậm hơn so với bất kỳ cách tiếp cận nào khác.

+0

Nhưng nếu việc tạo và biên dịch nguồn không chậm hơn codeDOM, Iam tự hỏi tại sao một thứ gì đó cần mã codeDOM, vì nó rất lỗi và giới hạn. – codymanix

+0

Tôi muốn được quan tâm đến nguồn thông tin của bạn về việc nó "rất lỗi" và bị hạn chế. Một trong những mục đích của CodeDOM là cho phép các nhà thiết kế tạo mã bằng cách sử dụng một mô hình duy nhất và sau đó CodeDOM được chuyển đổi thành VB hoặc CS hoặc bất kỳ ngôn ngữ nào mà dự án máy chủ đang sử dụng. CodeDOM cũng được sử dụng trong những thứ như Workflow Foundation để tạo ra một tệp quy tắc độc lập ngôn ngữ. – AnthonyWJones

+0

Xem tại đây: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/61552792-76a9-45f0-8ea9-99d2f8b6f6f0 – codymanix

1

Tạo thế hệ nguồn C# và không quan tâm đến tốc độ cho đến khi nó quan trọng. Trình biên dịch C# khá nhanh.

+0

Tính năng tự động hoàn thành của tôi cũng sẽ dựa vào bộ sưu tập đã biên dịch, vì vậy nó có là loại thời gian thực ^^ – codymanix

+0

Bạn có thể biên dịch mỗi lớp thành một hội đồng riêng. – erikkallen

1

Khi tôi viết trình tạo mã động, tôi dựa rất nhiều vào System.Reflection.Emit.

Về cơ bản, bạn lập trình tạo các cụm động và thêm các kiểu mới cho chúng. Các kiểu này được xây dựng bằng cách sử dụng các cấu trúc Emit (các thuộc tính, các sự kiện, các trường, v.v.). Khi nói đến các phương pháp triển khai thực hiện, bạn sẽ phải sử dụng một ILGenerator để bơm ra các mã mở MSIL vào phương thức của bạn. Đó là âm thanh siêu đáng sợ, nhưng bạn có thể sử dụng một vài công cụ để giúp:

  • Một thực hiện mẫu được xây dựng trước
  • ILDASM để kiểm tra việc op-mã của việc thực hiện mẫu.
0

Tôi sẽ lặp lại những người khác trong đó 1) trình biên dịch nhanh và 2) "Nhấp và Phát" mọi thứ phải đủ đơn giản để không có tiện ích nào được thêm vào một chồng tiện ích.

Chúc may mắn. Tôi nghi ngờ rằng bạn có thể đạt được điểm (2) cho bất cứ điều gì nhưng thực sự là chương trình đồ chơi cấp.