본문 바로가기

.NET/C#

컴퓨터에서 실행되는 프로세스중에 닷넷 어플리케이션인것 찾기


http://blog.naver.com/techshare/100151470787

이에 대해서는, 어려운 방법을 쓰려면 한없이 어려워지겠지만 간단하게 생각하면 그다지 어렵지 않습니다.

쉽게 생각해 볼까요? ^^ 현재 대표적으로 .NET 2.0 과 .NET 4.0 유형이 있으니, 이들을 실행해보고 "Process Explorer" 같은 도구를 이용하여 공통적으로 올라오는 DLL 을 확인해 볼 수 있습니다.

결과는 다음과 같습니다.

.NET 4.0
<ul>
  • mscoree.dll
  • mscoreei.dll
  • clr.dll
  • clrjit.dll
  • </ul> .NET 2.0 <ul>
  • mscoree.dll
  • mscorjit.dll
  • mscorwks.dll
  • </ul>

    mscoree.dll 파일이 중복되는 군요. 그런데, 테스트를 하다 보니 mscoree.dll 까지만 올라오고 실제 닷넷 응용 프로그램으로써 동작을 하면 로드가 되는 mscorlib.dll 이 없는 프로세스들이 있었습니다. 일례로, explorer.exe 가 그런 경우입니다. 음... 조금 고민하다가 그냥 mscorlib.dll 로 판단하기로 했습니다.

    이런 판단 기준으로 다음과 같이 코드를 실행하면 .NET 응용 프로그램을 구별해 낼 수 있습니다.

    HashSet<string> _netApp = new HashSet<string>();
    List<string> netAppList = new List<string>();
    
    _netApp.Add("mscorlib.dll");
    _netApp.Add("mscorlib.ni.dll");
    
    foreach (Process process in Process.GetProcesses())
    {
        if (IsNetApplication(process) == true)
        {
            Console.WriteLine(".NET Application: " + process.ProcessName);
            netAppList.Add(process.ProcessName);
        }
    }
    
    private bool IsNetApplication(Process process)
    {
        try
        {
            if (Process.GetCurrentProcess().ProcessName == process.ProcessName)
            {
                return false;
            }
    
            foreach (ProcessModule module in process.Modules)
            {
                string fileName = Path.GetFileName(module.FileName).ToLower();
    
                if (_netApp.Contains(fileName) == true)
                {
                    return true;
                }
            }
        }
        catch (Win32Exception)
        {
        }
    
        return false;
    }
    

    그런데, 아쉬움이 하나 있더군요. 뭐냐 하면, 위의 코드를 실행하는 EXE 프로세스가 x64 이면 열람되는 응용 프로그램도 x64 만 되고 x86 의 경우에도 마찬가지 현상이 있었습니다. 하나의 응용 프로그램에서 그냥 모든 목록을 구할 수는 없는 걸까요?

    이 대목에서 ^^ 다음의 글을 생각해 냈다면 SYSNET 웹 사이트를 아주 잘 이용하시는 분이라고 자부하셔도 좋겠습니다. ^^

    x86/x64 로 구분된 코드를 포함하는 경우, 다중으로 어셈블리를 만들어야 할까요?
    ; http://www.sysnet.pe.kr/2/0/1207
    

    위에서 설명한 방식을 이용해서 프로그램 구조를 확장하면 x86 및 x64 응용 프로그램 모두를 열람할 수 있습니다. 코드가 중복되니, (지면은 없지만) '지면 관계상' 생략하고 첨부 파일에 넣어두었으니 참고하십시오. ^^

    참고로, 제 컴퓨터에서 첨부 파일을 빌드해서 출력한 결과는 다음과 같습니다.

    [x64 .NET Application]
    .NET Application: MOM
    
    [x86 .NET Application]
    .NET Application: vsaenv10
    .NET Application: vsmsvr10
    .NET Application: devenv
    .NET Application: iisexpress
    .NET Application: iisexpresstray
    

    그리고, 해당 EXE 파일을 '관리자 권한'으로 실행하면 NT 서비스까지 모두 열람할 수 있습니다.

    [x64 .NET Application]
    .NET Application: SMSvcHost
    .NET Application: MOM
    .NET Application: MsDepSvc
    
    [x86 .NET Application]
    .NET Application: vsaenv10
    .NET Application: vsmsvr10
    .NET Application: devenv
    .NET Application: iisexpress
    .NET Application: iisexpresstray