2012-05-25 3 views
4

나는 .cab 파일에 포함 된 파일의 버전 번호를 얻을 수있는 작은 응용 프로그램을 작성했습니다. 다음과 같이수 없습니다 파일 (.exe)

나는 버전 번호를 모든 파일을 임시 디렉토리 및 루프에 택시에서 모든 파일을 추출하고 검색 :

다음
//Attempt to load .net assembly to retrieve information 
Assembly assembly = Assembly.LoadFile(tempDir + @"\" + renameTo); 
Version version = assembly.GetName().Version; 
DataRow dr = dt.NewRow(); 
dr["Product"] = renameTo; 
dr["Version"] = version.ToString(); 
dt.Rows.Add(dr); 

내가 같이 추출 된 모든 파일을 삭제할 완료되면 다음과 같습니다 :

 foreach (string filePath in filePaths) 
     { 
      //Remove read-only attribute if set 
      FileAttributes attributes = File.GetAttributes(filePath); 

      if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      { 
       File.SetAttributes(filePath, attributes^FileAttributes.ReadOnly); 
      } 

      File.Delete(filePath); 
     } 

이 파일은 .net .exe 파일을 제외하고 모든 파일에서 작동합니다. 파일을 수동으로 삭제할 수 있으므로 잠긴 것처럼 보이지 않습니다.

나는이 일을 할 수 찾고해야합니까? Assembly.LoadFile이 아마도 파일을 잠그고 있습니까?

+2

당신이'Assembly.LoadReflectionOnlyFrom (문자열 경로)'사용하는 경우? 어쨌든 그 이상을 필요로하지 않는 것 같습니다. – Jay

+1

AppDomain에서 어셈블리를 언로드 할 수는 없지만 AppDomain을 언로드 할 수는 있습니다. Assembly.Load 실제로 어셈블리를 고정하는 경우에 따라서, 당신은 새로운 응용 프로그램 도메인'var에 MYDOMAIN는 = AppDomain.CreateDomain는 ("MYDOMAIN")가', 그 안에 모든 어셈블리를로드와의 AppDomain.Unload'와 응용 프로그램 도메인을 언로드를 만들 수 있습니다 (myDomain)'입니다. –

+1

@Jay - 아니요, 여전히 AppDomain을 언로드해야합니다 (http://msdn.microsoft).com/ko-en/us/library/h55she1h –

답변

2

AssemblyName.GetAssemblyName 당신의 파일을 잠금없이 AssemblyName 개체를 얻을 것이다. msdn을 참조하십시오. 거기에서 버전을 얻을 수 있습니다.

+1

다른 모든 대답도 문제를 해결할 수 있지만 필자가 필요로하는 것 중 가장 간단한 문제였습니다. 건배. – Fishcake

6

Assembly.LoadFile는 실제로 파일을 잠글 않습니다. 당신이 파일을 파일에서 어셈블리를로드 한 후 나중에 삭제해야하는 경우, 당신이해야 할 것은 : 그것을 사용하지 않는 there-와

  1. Start a new AppDomain
  2. 로드가 응용 프로그램 도메인에서 어셈블리가
  3. 만 작동 기본 appdomain에있는 어셈블리의 모든 유형.
  4. 전화 AppDomain.Unload 당신은 해당 어셈블리가 실행하는 응용 프로그램 도메인에로드되는 동안 어셈블리를 포함하는 파일을 삭제할 수 없습니다 그런 다음 파일

을 삭제하려면 응용 프로그램 도메인

  • 를 해체합니다.

  • 1

    별도의 AppDomain에서 파일에서로드를 사용하는 것 외에 다른 접근 방법은 Assembly.Load from bytes을 사용하여 파일의 MemoryStream 복사본에서 어셈블리를 주 AppDomain으로로드하는 것입니다.

    코드가 완전히 정확하려면 한 파일에 동일한 ID가있는 어셈블리 (즉, 파일 이름이 같은 서명되지 않은 어셈블리가 2 개) 인 경우 각 어셈블리마다 별도의 AppDomains가 필요할 수 있습니다. 심지어 별도의 응용 프로그램 도메인에

    거기 AppDomain을 언로드 실패가 잠긴 파일을 유지 것이라는 가능성은 없다 당신이 파일의 잠금을 완벽하게 제어 할이 경우 이후 당신의 시나리오 LoadReflectionOnlyFrom와 바이트에서로드 안전 할 것 당신 자신. 바이트에서로드를 사용하여 어셈블리를 정기적으로로드하려면 관련 문제를 이해하고 피하는 것이 중요합니다.