2013-10-15 10 views
3

개발중인 응용 프로그램에서 "ngen install ..."을 실행했습니다. 하지만 어셈블리를 덮어 쓰기 전에 일부 버전/시나리오 (디버그 등)에서 "ngen uninstall ..."을 실행하지 않았습니다. 이제는 * .ni.exe 및 * .ni.dll이 "C : \ Windows \ assembly \ NativeImages_v4.0.30319_64 \ AssemblyName \ hashkey"형식의 폴더에 나타납니다. (DLL은 내부적으로 사람을 개발하고 있습니다.) 나는이를 제거IL 어셈블리와 일치하지 않는 ngen으로 생성 된 오래된 .net 기본 이미지를 제거하는 방법은 무엇입니까?

닷넷 4. 어쨌든 있나요 사용하고

? 나는 "고아원 업데이트"를 시도했는데, 고아가 된 네이티브 이미지에 닿지 않는 것 같습니다. 물론 수동으로 삭제할 수는 있지만, 어셈블리가 의존하는 시스템 DLL에 대한 참조 횟수가 너무 많아 지거나 .net 시스템에 나쁜 영향을 미칩니다.

공간을 차지하는 것 외에이 오래된 어셈블리는 어셈블리 바인더가 현재 IL을 각 기본 어셈블리와 일치 시키려고 할 때 시작 지연을 아프게합니다.

또한 명령 줄을 사용하는 대신 기본 이미지 캐시에있는 것을 보는 더 좋은 방법이 있습니까?

감사

+1

'ngen uninstall AssemblyName'이 작동하지 않습니까? – cremor

+0

전체 어셈블리 이름이 작동합니다. 감사합니다! (Name, Version = x.x.x.x, Culture = neutral, PublicKeyToken = null) – Jeevaka

답변

2

ngen uninstall AssemblyName 작동합니다. AssemblyName은 부분 또는 전체 어셈블리 이름이 될 수 있습니다.

3

이 질문에 대한 답변이 이미있는 반면 오래된 (오래된) ngen'ed 어셈블리를 제거하려는 경우 고려해야 할 몇 가지 사항이 있습니다.

  • ngen display을 수행 할 때 NGen에서 해당 NGen (CLR 버전, 32 비트/64 비트)을 설치했는지 확인하십시오. ngen display yourasm.dll을 사용하면 파일 이름에서 작동하지 않지만 ngen display AssemblyName은 (내부 어셈블리 이름)입니다. 부분적인 이름을 사용할 수 있습니다.
  • ngen uninstall을 사용하는 경우 설치 한 역순으로 제거하십시오. 종속성이 제거되지 않습니다,하지만 당신은 종속 어셈블리를 설치하기 전에 수동으로 종속성을 설치 한 경우, 먼저 종속 어셈블리를 제거해야합니다

    • A는 B와 C와 B가 C에 의존에 의존하는 경우, 당신은 한 :

      다음
      ngen install B 
      ngen install C 
      ngen install A 
      

      당신이 오직 수행하여 그들을 제거 할 수 있습니다 : 당신이 종속성을 모르는 경우의 출력을 확인

      ngen uninstall A // removes A, if nothing is dependent on it 
      ngen uninstall C // removes C, it has no dependencies now 
      ngen uninstall B // removes B, it has no dependencies now 
      
    • , "ROOT"아래 종속성을 나열합니다. 다른 응용 프로그램이 파일 중 하나를 사용하는 경우가 아래에 아무것도

    • 먼저 제거해야합니다, 당신은 제거해야 할 첫 번째
    • 다음 명령 여부와 c:\windows\assembly\NativeImages_v4.0.30319_64 (그리고 *_32 버전)에서 확인하는 것이 도움이 발견하는 경우 여전히 설치되어 있습니다 :

      여기에는 많은 파일이 있으므로 아직 무엇이 있는지 볼 수 있습니다. 또한 그들이 속한 버전 (32 비트, 64 비트, MSIL)을 찾는 데 도움이됩니다. 그들이 배치 된 프로파일에 도움이되지 않는 것 같습니다.

  • 나는 c:\windows\assembly 폴더의 Windows 탐색기 뷰가 아닌 GAC에, ngen'ed하는 어셈블리를 표시하지 않는 것으로 나타났습니다. 그러나 어셈블리가 GAC에도있는 경우 마우스 오른쪽 단추로 클릭 한 다음 "제거"를 선택하여 GAC 및 NGen 캐시에서 어셈블리를 제거 할 수 있습니다.

위 이외에도 오래된 이미지가 많으면 성능이 저하되지 않습니다. CLR은 어셈블리 이름 (이름, 버전, 공개 키 토큰) 및 몇 가지 다른 휴리스틱 (파일 날짜, 내부 생성 날짜, 해시)을 기반으로 파일을 여기에 저장합니다. 네가 옛날에 찍은 이미지들도 만지지 않을거야. 프로세스 모니터를 사용하여이를 확인할 수 있습니다 (해시 등을 기반으로 한 위치에서 ngen'ed 이미지를로드하는 경우에만 시도합니다). 그러나 나는 동의한다, 주변에 그들을 지켜야한다.

+0

...에 의존하는 NGEN Roots 아래의 파일은 dll, exe 및 기본 이미지가 혼합되어 있습니다. 그래서 당신은 unistalled해야하는 네이티브 이미지에 대해 이야기하는 것 같아요? –