2009-02-23 24 views
10

Điều này bắt đầu như là một cách để tìm C++/CLI và Managed C++ assembly để tất cả các lớp bên trong chúng có thể được kiểm tra để đảm bảo tất cả các phương thức kế thừa đã được thực hiện lại. Tôi muốn thêm điều này như là một quá trình xây dựng bước để đảm bảo rằng nó không bao giờ xảy ra một lần nữa.Có thể xác định được ngôn ngữ nào mà .NET Assembly đã viết trên thực tế không?

Suy nghĩ về vấn đề này cũng khiến tôi hơi tò mò vì sẽ rất thú vị khi có thể xác định bất kỳ ngôn ngữ .NET nào được sử dụng. Bởi vì điều này, tôi đã đi xa hơn một chút và so sánh các hội đồng từ tất cả các ngôn ngữ .NET. Cho đến nay đây là những gì tôi đã tìm thấy thông qua một chương trình nhỏ mà tôi đã viết so sánh các loại và thuộc tính dữ liệu từ bất kỳ tập hợp hội NET thông qua phản ánh:

  • C# - Có AssemblyConfigurationAttribute, Có GuidAttribute
  • VB - Có nhiều loại "My" bổ sung (ví dụ: MyApplication, MySettings), Has GuidAttibute
  • F # - Có một FSharpInterfaceDataVersionAttribute cũng chỉ định phiên bản trình biên dịch được sử dụng.
  • C++ (tất cả trừ/clr: an toàn) - Có nhiều loại bổ sung (FrameInfo, type_info)
  • C++/clr: safe - Dường như không có tính năng phản chiếu độc đáo.

Nó có thể là hợp lý để phân tích theo thứ tự này:

  1. Đó là F # nếu nó có FSharpInterfaceDataVersionAttribute
  2. Đó là C++ nếu có bất kỳ trong tập khổng lồ các loại phụ tôi được tìm thấy.
  3. Đó là VB nếu có loại "My *".
  4. Đó là C# nếu nó có AssemblyConfigurationAttribute hoặc GuidAttribute
  5. Đó là khả năng là C++/clr: Safe

Tuy nhiên, vì đây là một hack kinh khủng, tôi muốn đăng ký tại đây để đảm bảo rằng có wasn không có tùy chọn khác.

+0

Câu hỏi thú vị, nhưng tại sao lại sử dụng chữ Latinh? Nhìn lại sẽ dễ hiểu hơn. Không phải tất cả mọi người ở đây đều là một người nói tiếng Anh bản địa. – danio

+1

@danio: Bởi vì tiếng Latin thật tuyệt vời? – bcat

Trả lời

2

Khi ngôn ngữ .NET được biên dịch, tất cả những gì bạn nhận được là IL. Tôi không biết một cách tiêu chuẩn để xác định ngôn ngữ cụ thể nào đã tạo ra assembly. Bạn có thể lấy một assembly hiện có và ildasm (tháo rời) nó thành IL và chúng ilasm (lắp ráp) nó trở lại thành một assembly hầu như giống hệt nhau.

Các chẩn đoán bạn sử dụng là một cách hợp lý và thông minh để xác định ngôn ngữ được sử dụng để tạo hội đồng. Tuy nhiên, hãy nhớ rằng những chi tiết này có thể thay đổi giữa các phiên bản trình biên dịch của các ngôn ngữ.

3

Kiểm tra các tham chiếu cho những thứ như thư viện lớp VB hoặc F # có vẻ là cách ít run rẩy nhất để làm điều này, nhưng như những người khác đề cập đến, đó là một heuristic - giống như không có cách dứt khoát để cho biết được viết bằng (nhưng bạn có thể gần như chắc chắn 100% bằng cách phỏng đoán)

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