간단히 말해 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.dll
및 NewName.dll
을 가질 수 있도록, OldName.dll
로 이름을 변경하는 경우
지금 이상한 일이있다, 문제가 계속. Procmon.exe 그것이 OldName.dll
때문에 FILE LOCKED WITH ONLY READERS
에 CreateFileMapping
작업을 실패했음을보고, 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이 제안했듯이 이전 어셈블리 이름은 여전히 직렬화 된 데이터 파일에 나타났습니다. 따라서 프로그램에서로드하려고 시도했을 때에있는 어셈블리를 찾을 수 없어 예외가 발생했습니다. .
어떻게 직렬화를 사용합니까? 이진, XML, 데이터 계약? 이 질문에 대한 대답은 다음과 같습니다. http://stackoverflow.com/questions/950992/version-tolerant-serialization-how-to-find-assemblyname-of-the-original –