http://blog.naver.com/techshare/100151470787
이에 대해서는, 어려운 방법을 쓰려면 한없이 어려워지겠지만 간단하게 생각하면 그다지 어렵지 않습니다.
쉽게 생각해 볼까요? ^^ 현재 대표적으로 .NET 2.0 과 .NET 4.0 유형이 있으니, 이들을 실행해보고 "Process Explorer" 같은 도구를 이용하여 공통적으로 올라오는 DLL 을 확인해 볼 수 있습니다.
결과는 다음과 같습니다.
.NET 4.0 <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