2009-06-30 8 views
3

어셈블리가 변경되었는지 여부를 알 수 있습니까?어셈블리가 변경되었는지 확인하는 방법

MyAssembly.dll이라는 어셈블리를 생성하는 표준 프로젝트가 있습니다.

별도의 프로젝트에서 어셈블리를 읽고 해시를 생성합니다.

어셈블리의 해시를 생성하면 다시 컴파일 할 때마다 다릅니다. 정적 인 어셈블리 버전을 설정했습니다. 변경해야하는 다른 특성이 있습니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var array = File.ReadAllBytes(@"MyAssembly.dll"); 
     SHA256Managed algo = new SHA256Managed(); 
     var hash = algo.ComputeHash(array); 

     Console.WriteLine(Convert.ToBase64String(hash)); 
    } 
} 

감사

로한

+0

어셈블리에 몇 개의 클래스가 있습니까? –

+0

어떤 수의 클래스도 현재는 코드가 변경되지 않아도 recomplie가 새 해시를 생성 할 때도 내가 수행중인 작업이 하나의 클래스 인 –

답변

4

아마 버전 번호 속성을 사용해야 할 것입니다. 어셈블리를 다시 컴파일 할 때마다 해시가 작동하지 않으므로 코드가 전혀 변경되지 않아도 해시가 달라집니다. 그 이유는 컴파일 할 때마다 컴파일러가 guid를 어셈블리에 포함하고 동일한 GUID를 해당 .pdb 파일에 넣기 때문입니다. 어셈블리가 컴파일 될 때마다 guid가 변경됩니다.

이것은 디버거가 어셈블리를 올바른 .pdb 파일 버전과 일치시키는 방법입니다 (릴리스 된 .pdb 파일을 항상 저장해야하는 이유이며 pdb를 생성 할 수있는 것에 의존 할 수 없습니다). 기존 어셈블리와 일치)

2

당신은 그것을 생성 한 후, 다음에 당신이 다시 컴파일 다음 시간을 확인하는 텍스트 파일의 해시를 저장할 수 있습니다.

+0

입니다. –

1

글쎄, 자신이 관리하는 어셈블리 인 경우 해당 어셈블리를 빌드 할 때마다 버전 번호와 auto-increase 버전 번호를 추가하는 것이 좋습니다.

그런 다음 버전 번호를 확인할 수 있습니다.

+0

버전 번호는 어셈블리가 변경되었는지 확인하는 올바른 방법입니다. –

+0

그렇습니다.하지만 dll은 버전 번호를 유지 관리하지 않는 외부 소스에서 가져온 것일 수 있습니다 (부끄러운 것!). – Stormenet

+0

빌드가 수행 될 때마다 버전이 증가하므로 코드가 변경되었는지 알 수 없습니다. 내가 정말로하고 싶은 것은 어셈블리가 변경된 경우에 recomplie를 확인하는 것입니다. 선택 빌드를하거나 변경된 프로젝트 만 빌드하는 사용자 정의 빌드 스크립트를 만들고 싶지 않습니다. –

0

This projectMD5 해시를 생성하기 전에 각 파일을 분해하고 다른 소수 비트와 함께 MVID GUID를 삭제하여 트릭을 수행하는 것으로 보입니다. 그것은 ildasm.exe에 의존합니다.

관련 문제