2011-12-08 31 views
13

thể trùng lặp:
How do I tell if a win32 application uses the .NET runtimeLàm cách nào để biết liệu quy trình ".exe" được viết bằng C++ hay C#?

Có một cách để tự nhận ra nếu một cụ ".exe" quá trình được viết với C++ (unmanaged code) hoặc với C# (managed code) ?

+2

Tôi đã có thể nói rằng có một cách, vì Process Explorer thực hiện điều đó. Bây giờ chúng ta phải tìm cách: p –

+0

Hãy thử nhấn exe với [Reflector] [1] để xem cái gì sẽ xuất hiện. [1]: http://stackoverflow.com/questions/214764/best-free-decompiler-for-c-sharp-with-vs-integration – jp2code

+1

Lưu ý rằng các chương trình viết bằng VB.NET tạo cùng "loại" thực thi như những gì được viết bằng C# và bạn chỉ có thể đoán được những gì đã được sử dụng để tạo ứng dụng không được quản lý. Như những người khác đã đề cập, bạn có thể phân biệt không được quản lý từ mã được quản lý. –

Trả lời

8

Nếu bạn đang cố gắng để xác định xem một quá trình là một quá trình .NET, tôi có thể đề nghị một giải pháp lấy cảm hứng từ câu trả lời Dave Van den Eynde của trong chủ đề này: How do I tell if a win32 application uses the .NET runtime

"Ứng dụng là tệp thực thi .NET nếu yêu cầu mscoree.dll chạy.".

Cho rằng, bạn kiểm tra quy trình 'mô-đun để xem liệu mscoree có được liệt kê hay không.

 foreach (var process in Process.GetProcesses()) 
     { 
      if (process.Modules.OfType<ProcessModule>().Any(m => m.ModuleName.Equals("mscoree.dll", StringComparison.OrdinalIgnoreCase))) 
      { 
       Console.WriteLine("{0} is a .NET process", process.ProcessName); 
      } 
     } 
+0

"mscoree.dll" có phải là tài nguyên dll chính của C# được quản lý mã binnary không? Tôi có thể tin tưởng rằng không có nhị phân C++ nào sử dụng cùng một dll? – Diogo

+0

Nó không phải là một thư viện được quản lý, nhưng mọi thứ trong dll này đều liên quan đến .NET Framework. Nó không đảm bảo rằng quá trình này là một ứng dụng .NET thuần túy, nhưng ít nhất nó cũng lưu trữ một số mã .NET. Ví dụ, nếu bạn nạp một bổ trợ .NET trong Microsoft Word, dll này sẽ xuất hiện trong các mô-đun, mặc dù Word không phải là một ứng dụng .NET. –

+1

Tại sao ứng dụng bảng điều khiển được viết bằng C# không hiển thị dưới dạng ứng dụng được quản lý khi sử dụng cách này để kiểm tra? – stt106

2

Bạn có thể chạy peverify hoặc ildasm (có sẵn từ môi trường dòng lệnh Visual Studio) trên tệp và nó sẽ cho bạn lỗi nếu nó không được quản lý mã. Lưu ý rằng điều này sẽ thất bại trong một số trường hợp mà họ sử dụng một hệ thống bảo vệ mã hóa IL và ẩn bộ nạp khởi động CLR, nhưng hầu hết các chương trình không có bảo vệ này.

1

Nếu đó là một .exe NET (hoặc .dll cho rằng vấn đề), nó sẽ có một sự phụ thuộc vào mscoree.dll mà bạn có thể nhìn thấy bằng cách kiểm tra nó với Dependency Walker hoặc một cái gì đó tương tự.

Nếu bạn muốn làm như vậy theo chương trình, bạn có thể lấy this VB project làm điểm bắt đầu.

Điều này sẽ không cho bạn biết ngôn ngữ đó. Bạn không thể nói một C# từ một chương trình VB.NET (hoặc ngôn ngữ .NET) hoặc một C++ từ một chương trình C (hoặc ngôn ngữ không phải .NET). Có một số thứ có thể loại trừ một hoặc một thứ khác như là ngôn ngữ duy nhất được sử dụng, hoặc làm cho một hoặc nhiều khả năng khác. Thậm chí có thể có mã không được quản lý sử dụng mscoree.dll theo một cách kỳ lạ nào đó.

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