2009-07-24 2 views
0

프로그래밍 방식으로 DLL을로드하고 코드를 실행해야하는 프로젝트가 있습니다. DLL과 그 의존성은 데이터베이스에 저장되고 디스크에 기록되지만, DLL을 다시 작성하기 전에 DLL이 이미 있는지 확인하려고합니다. 현재 데이터베이스에는 파일의 강력한 어셈블리 이름과 이진 데이터 및 버전 번호가 들어 있습니다. 어셈블리의 공개 키를 DLL 디렉토리에있는 기존 파일의 키와 대조하여 저장해야한다고 생각합니다.강력한 어셈블리 이름과 키 파일을 사용하여로드중인 DLL이 예상 한 것임을 확인하는 방법은 무엇입니까?

AssemblyName.GetPublicKey()를 사용하여 어셈블리의 공개 키를 가져올 수 있다는 것을 알고 있습니다. 데이터베이스의 파일 공개 키도 저장해야합니까? 코드에 공개 키가 없으면 어셈블리가 어떻게 검증됩니까? 필자가 찾은 모든 코드 예제는 공개 키를 가져 오거나 강력한 이름이 있는지 확인하는 것으로 나타납니다.

지금 당장은 핵심 라이브러리 인 라이브러리 관리 클래스에 대해 설명하고 있습니다. 시작시 dll 디렉토리를 확인하고 각 파일의 공개 키를 사전에 추가합니다. 그런 다음 어셈블리가 이미 디스크에 있는지 확인해야 할 때 사전을 확인할 수 있습니다 (하지만 데이터베이스에 공개 키를 저장해야합니다). 또한 FileSystemWatcher를 사용하여 라이브러리의 모든 변경 사항을 모니터링합니다. 업데이트 된 어셈블리를 작성해야한다면 디스크에있는 어셈블리를 덮어 쓰고 클래스는 사전을 업데이트합니다.

+0

강력한 이름의 어셈블리에 저장된 해시 값을 다시 사용하여 두 파일을 비교하려고합니까? –

+0

@ 스페 넌, 제 질문 이군요, 그렇습니까? 다른 방법이 있습니까? – scottm

답변

0

SN 데이터를 다시 사용할 수 있다고 생각하지만 그렇지 않습니다. 첫째, 공개 키를 얻는 것만으로는 충분하지 않습니다. 공개 키는 버전간에 변경되지 않습니다. 오히려 개인 키로 암호화 된 해시를 추출해야합니다. 나는 그것을 수행하는 방법을 모르는 것이므로 다른 것을 시도 할 이유 중 하나입니다.

대신 각 빌드의 버전 번호가 고유한지 확인해야합니다. 정말로해야한다면 SHA1 클래스를 사용하여 자신의 해시를 실행할 수 있지만 편집증 적으로 보인다.

편집

그냥 명확하게하기 위해, 공개 키가 다음 갓 생성 된 해시와 비교되어 저장된 해시를 해독하는 데 사용됩니다. 모든 공개 키가 작동하기 때문에 로딩 프로그램은 허용 된 공개 키를 지정하는 강력한 이름을 사용해야합니다.

또한 공개 키가 아닌 완전한 강력한 이름을 저장해야합니다. 여기에는 버전과 공개 키가 포함됩니다.

+0

강력한 이름이 저장되어 있습니다. 그냥 확인해 봐야합니까? – scottm

+0

그렇습니다. 그러나 각 컴파일이 새 버전 번호를 생성한다는 제약 조건을 적용 할 때만 가능합니다.이 새로운 버전 번호는 실제로 처음부터해야 할 일입니다. –

+0

새로운 릴리스 빌드가 디버그 모드로 빌드되지 않고 새 버전을 생성하도록 설정할 수 있습니까? – scottm

0

나는 내가 묻고있는 어셈블리를 실제로로드하기 위해 DotNET 프레임 워크에 의존 할 수 없다는 것을 알았다. 때때로 버전 번호가 높은 다른 어셈블리를 반환합니다 (너무 영리합니다). 그런 다음

''' <summary> 
''' Converts a DotNET class library to a COFF-based image containing the entire assembly 
''' </summary> 
Public Shared Function ReadAssembly(ByVal iPath As String) As Byte() 
    If (Not IO.File.Exists(iPath)) Then Return Nothing 

    Try 
    Dim file_info As New FileInfo(iPath) 
    Dim file_byte(Convert.ToInt32(file_info.Length)) As Byte 
    Dim file_stream As New FileStream(iPath, FileMode.Open) 

    file_stream.Read(file_byte, 0, file_byte.Length) 
    file_stream.Close() 

    Return file_byte 

    Catch ex As Exception 
    Kernel.EH_LogServer.AddMessage("Assembly reading failed: " & ex.Message, EH_RuntimeMessageType.Error) 
    Return Nothing 
    End Try 
End Function 

는 Assembly.Load (coff_image가)

나는를 실행하는 것 호출의 문제 :

는 지금은 메모리에, 다음 COFF 스트림에서 어셈블리를로드 어셈블리 파일을 읽을 수 두 배열 사이에 차이가 있는지 확인하기 위해 바이트 배열의 CRC 검사.

+0

프로젝트의 어셈블리 참조에서 "특정 버전"을 true로 설정 했습니까? 이렇게하면 최신 버전이로드되지 않습니다. –

+0

디자인 타임 참조가 아닙니다. 내가 컴파일 할 때 어떤 플러그인을 사용할 수 있을지 전혀 알지 못하므로 런타임시 플러그인 dll을로드 중입니다. –

+0

나는 이해하지 못한다. 파일에서 어셈블리를로드하는 경우 해당 파일에있는 버전을 가져옵니다. –