2010-01-17 56 views
32

Chúng tôi có thể kiểm tra xem ứng dụng đang chạy hay chương trình có sử dụng .Net framework để thực thi chính nó không?Cách kiểm tra xem chương trình có đang sử dụng .NET không?

+6

Xoay màn hình quy trình và nếu tệp thực thi được đánh dấu màu vàng, đó là ứng dụng được quản lý. Hurr. – Will

+3

Will, tôi nghĩ bạn có nghĩa là Process Explorer;) –

Trả lời

38

Có một mẹo tôi từng học được từ số list of interview questions của Scott Hanselman. Bạn có thể dễ dàng liệt kê tất cả các chương trình đang chạy NET tại dấu nhắc lệnh bằng cách sử dụng:

tasklist /m "mscor*"

Nó sẽ liệt kê tất cả các quá trình có mscor* giữa các module được nạp họ.

Chúng ta có thể áp dụng cùng một phương pháp trong mã:

public static bool IsDotNetProcess(this Process process) 
{ 
    var modules = process.Modules.Cast<ProcessModule>().Where(
     m => m.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase)); 

    return modules.Any(); 
} 
+3

Lưu ý rằng điều này sẽ loại bỏ các quy trình Mono có thể xảy ra. – Dykam

+0

@Dykam Không phải thời gian chạy của mono hay còn gọi là mscorlib.dll? –

+2

Thời gian chạy chỉ là 'mono'. Hoặc 'mono.exe' trên cửa sổ. .Net sử dụng PE để cho hệ điều hành sử dụng mscorlib.dll để khởi động ứng dụng, nhưng mono không làm như vậy. Và lib cốt lõi thực sự được gọi là corlib.dll Tôi nghĩ, vì nó không phải là corlib của MS. – Dykam

6

Sử dụng chức năng System.Reflection.Assembly.LoadFrom để tải tệp .exe. Hàm này sẽ ném ngoại lệ nếu bạn cố tải tệp nhị phân không phải là assembly .NET.

+1

-1: Anh ta hỏi về một ứng dụng đang chạy –

+4

nó tạo nên sự khác biệt nào? ứng dụng đang chạy không có tệp .exe? –

+0

Trong trường hợp đó, hãy chỉ cho anh ta cách tìm tệp EXE tương ứng với chương trình đang chạy; và chỉ cho anh ta cách đối phó với khả năng quá trình của anh ấy không thể truy cập được đọc vào tệp .EXE. –

6

Lập trình bạn sẽ nhận được tên hình ảnh bắt đầu bằng cách sử dụng API Win32 như NtQueryInformationProcess hoặc sử dụng .Net System.Diagnostics.Process.GetProcesses() và đọc Process.StartInfo.FileName.

Sau đó mở và giải mã các tiêu đề PE của hình ảnh đó sử dụng nội dung quy định trong bài viết MSDN dưới đây:

http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

Hãy cẩn thận: sẽ chỉ phát hiện NET xây dựng cụm ví dụ sẽ không phát hiện Win32 EXE tự động lưu trữ CLR bằng cách sử dụng API CorHost.

11

Sử dụng CLR COM giao diện ICorPublish và ICorPublishProcess. Cách đơn giản nhất để làm điều này từ C# là để mượn một số mã từ debugger SharpDevelop, và làm như sau:

ICorPublish publish = new ICorPublish(); 
ICorPublishProcess process; 

process = publish.GetProcess(PidToCheck); 

if (process == null || !process.IsManaged) 
{ 
    // Not managed. 
} 
else 
{ 
    // Managed. 
} 
+0

Tôi đã tự hỏi, nếu bạn làm điều này từ C#, theo đó điều kiện này sẽ kiểm tra báo cáo "không được quản lý"? – stakx

+0

Dường như nó sẽ chỉ xem xét quản lý các quy trình có cùng CLR được sử dụng - https://social.msdn.microsoft.com/Forums/en-US/fac08eee-001d-4566-b1e7-fda1ddbc37e7/icorpublishgetprocess-throws- systemargumentexception-value-does-không-fall-in-the-expected? forum = netfxtoolsdev. Vì vậy, một trong những nên cẩn thận với nó. –

2

Tôi đề nghị tải DotNetReflector của Redgate và kiểm tra nếu nó có thể mở ứng dụng.

6

Tôi biết điều này là khoảng một triệu năm quá muộn, nhưng trong trường hợp nó giúp - phương pháp ưa thích của tôi để tìm ra nếu một exe đang sử dụng .net là để chạy MSIL disassembler chống lại nó đi kèm với .net SDK. Nếu một exe .net bạn thực sự có, bạn sẽ nhận được một phân tích đồ họa đẹp về nội dung của nó; nếu một exe cũ win32 đơn giản, bạn sẽ nhận được một thông báo cho bạn biết như vậy.

+0

Câu trả lời hay. Cụ thể, chạy ILDASM.EXE, được cài đặt tự động với Visual Studio. Xem: http://msdn.microsoft.com/en-us/library/f7dy01k1(v=vs.110).aspx Để khởi chạy ILDASM từ Win8/VS2013: Start -> Visual Studio Tools -> Developer Command Prompt cho VS2013 . Từ Win8/VS2012: Bắt đầu -> Developer Command -> Developer Command Prompt cho VS2012. Từ Win7: Tất cả các chương trình -> Microsoft Visual Studio -> Công cụ Visual Studio -> Visual Studio Command Prompt. –

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