2

간단히 말해 C#의 Windows Forms 응용 프로그램 프로젝트와 클래스 라이브러리로 구성된 솔루션이 있습니다. 내 도서관 프로젝트 이름은 OldName입니다. 따라서 네임 스페이스는 OldName이고 생성 된 파일은 OldName.dll입니다.VS2010 어셈블리 이름을 바꾼 후에 찾을 수 없습니다.

이름을 변경하려고 했으므로 Properties로 가서 어셈블리 이름을 OldName에서 NewName으로 변경했습니다.

이제 건물은 NewName.dll을 생성합니다. 그러나 내 응용 프로그램에서이 DLL에 액세스하려고 시도하면 System.Runtime.Serialization.SerializationException이 표시됩니다. dll에는 일부 메서드를 이진 직렬화하는 메서드가 있습니다. Unable to find assembly 'OldName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Procmon.exe가 이전 DLL (NAME NOT FOUND)을 찾고 있음을 확인합니다. 나는 NewName.dll을 복사하고 내가 OldName.dllNewName.dll을 가질 수 있도록, OldName.dll로 이름을 변경하는 경우

지금 이상한 일이있다, 문제가 계속. Procmon.exe 그것이 OldName.dll 때문에 FILE LOCKED WITH ONLY READERSCreateFileMapping 작업을 실패했음을보고, System.IO.FileNotFoundException: Could not load file or assembly 'NewName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.이 시간,하지만 NewName.dll에 같은 일을 얻을 것 같다 내가 NewName.dll을 삭제 만 OldName.dll두면, 프로그램과 출시에 충돌합니다.

어셈블리 이름을 다시 OldName으로 변경하면 모든 사항이 수정되지만 파일 이름은 OldName이되고 그럴 필요가 없습니다.

내 인생에서 내가 이전 어셈블리 이름을 참조하는 곳을 찾아 낼 수는 없다. 나는 무엇을 놓칠 수 있 었는가?

해결 방법 : 내 프로그램을 사용하면 파일을 만들고 내 dll에있는 메서드로 직렬화를 사용하여 디스크에 저장할 수 있습니다. 또한 파일을로드 할 수 있습니다. 게으르다가, 나는 한 번 테스트 파일을 만들었고 계속 재사용했다. @Tigran이 제안했듯이 이전 어셈블리 이름은 여전히 ​​직렬화 된 데이터 파일에 나타났습니다. 따라서 프로그램에서로드하려고 시도했을 때에있는 어셈블리를 찾을 수 없어 예외가 발생했습니다. .

+1

어떻게 직렬화를 사용합니까? 이진, XML, 데이터 계약? 이 질문에 대한 대답은 다음과 같습니다. http://stackoverflow.com/questions/950992/version-tolerant-serialization-how-to-find-assemblyname-of-the-original –

답변

4

귀하의 프로그램에서 standart .NET serialization을 사용한다고 가정하면입니다. 그 일종의 .NET유형 정보 너무 저장 기억하십시오. 네임 스페이스를 사용하여 완전한 유형 정보. 즉, 어셈블리 이름을 변경하고 형식 이름이 일치하지 않으면 불일치가 발생합니다.

귀하가하지 않는 경우 명확히하십시오.

+0

당신은 절대적으로 옳습니다. 이 문제가 해결되었습니다 - 세부 사항으로 내 질문을 편집했습니다. – Superbest

+0

@Superbest : 나에게 유용한 느낌을 주셔서 감사합니다 :) – Tigran

관련 문제