private assembly 형태로 배포를 하려고합니다.
그래서 실행파일 manifest,
Microsoft.VC80.CRT.manifest, 필요한 DLL을
같은 폴더에 포함했습니다.
그런데 실행을 하면 여전히 에러가 납니다.
같은 폴더에 포함했는데도,
WinSxS에서 찾는거 같습니다.
뭔가를 더 해줘야 하나요?
VC++ 2005 배포 질문입니다.
Moderator: 류광
-
- Posts: 980
- Joined: 2003-06-01 12:28
- Location: 모대학
- Contact:
-
- Posts: 980
- Joined: 2003-06-01 12:28
- Location: 모대학
- Contact:
상관이 있습니다. 그걸 안지워주시면 죽었다 깨나도 winsxs에서 찾지 로컬에서 안찾습니다.
private assembly란 말 그대로 무슨일이 있어도 winsxs에서 안찾고 로컬에서 찾는다는 의미입니다. 만약에 winsxs에 있어도 로컬에 없다면 에러가 나도록하는 것이 private assembly입니다.
만약에 로컬에도 있고 winsxs에도 있다면 publicKeyToken을 안지워주시면 로컬 또는 winsxs에서 찾습니다. 그리고 없으면 에러가 납니다.
차이점이라면 winsxs에 존재해도 로컬에 있냐 없느냐에 따라서 private 과 public으로 나뉩니다.
따라서.. winsxs의 설정을 완전히 무시하고 내 스스로 구성을 하겠다고 한다면 publicKeyToken를 지우시고 private 으로 구성하셔야합니다. 하는 방법은 아래와 같습니다.
만약에 외부 특정 dll을 쓰신다면 해당 dll의 매니페스트 파일이 있어야하며(임베디드 된 상태라면 외부로 빼도록 재컴파일을 하거나 외부로 빼진것을 구해야합니다.) 그것 또한 지워주셔야합니다.
간단히 말하면 해당 어플리케이션이 실행하면서 올라가는 모든 바이너리의 매니페스트의 publicKeyToken을 다 지워주셔야하며 그 또한 모든 매니페스트가 실행파일과 각각의 dll이 존재하는 폴더에 동일하게 존재해야합니다. 그러기 위해서는 모든 바이너리의 매니페스트가 있어야합니다. 또한 버전도 확인 해야합니다. 버전 안맞으면 안올라옵니다. 그런데 좀 이상한건 매니페스트의 버전과 실제 dll의 파일 정보에 있는 버전이 동일하더라도 안올라는 경우가 있었습니다. 오히려 다른 버전 정보를 가지고 있는게 올라오더군요.. 그 정보랑 실제 파일의 해시값이 꼬인것으로 보입니다. 이점 유의하시고요..
private으로 구성하실려면 실행파일도 위에서 말씀드린데로 해야합니다. 안그러면 winsxs에서 찾습니다.
그렇지 않고 그냥 매니페스트와 dll을 동일한 폴더에 넣고 publicKeyToken를 안지워주시면 알아서 winsxs또는 로컬에서 찾습니다. 이래도 에러가 난다면 PE뷰어 등으로 빠진 dll이나 매니페스트가 있는지 확인해보세요.
예를 들면 아래와 같습니다.
위와 같이 전부 매니페스트가 존재하고 매니페스트 안에는 publicKeyToken가 없어야지 private로 구성이 완료됩니다.
private assembly란 말 그대로 무슨일이 있어도 winsxs에서 안찾고 로컬에서 찾는다는 의미입니다. 만약에 winsxs에 있어도 로컬에 없다면 에러가 나도록하는 것이 private assembly입니다.
만약에 로컬에도 있고 winsxs에도 있다면 publicKeyToken을 안지워주시면 로컬 또는 winsxs에서 찾습니다. 그리고 없으면 에러가 납니다.
차이점이라면 winsxs에 존재해도 로컬에 있냐 없느냐에 따라서 private 과 public으로 나뉩니다.
따라서.. winsxs의 설정을 완전히 무시하고 내 스스로 구성을 하겠다고 한다면 publicKeyToken를 지우시고 private 으로 구성하셔야합니다. 하는 방법은 아래와 같습니다.
만약에 외부 특정 dll을 쓰신다면 해당 dll의 매니페스트 파일이 있어야하며(임베디드 된 상태라면 외부로 빼도록 재컴파일을 하거나 외부로 빼진것을 구해야합니다.) 그것 또한 지워주셔야합니다.
간단히 말하면 해당 어플리케이션이 실행하면서 올라가는 모든 바이너리의 매니페스트의 publicKeyToken을 다 지워주셔야하며 그 또한 모든 매니페스트가 실행파일과 각각의 dll이 존재하는 폴더에 동일하게 존재해야합니다. 그러기 위해서는 모든 바이너리의 매니페스트가 있어야합니다. 또한 버전도 확인 해야합니다. 버전 안맞으면 안올라옵니다. 그런데 좀 이상한건 매니페스트의 버전과 실제 dll의 파일 정보에 있는 버전이 동일하더라도 안올라는 경우가 있었습니다. 오히려 다른 버전 정보를 가지고 있는게 올라오더군요.. 그 정보랑 실제 파일의 해시값이 꼬인것으로 보입니다. 이점 유의하시고요..
private으로 구성하실려면 실행파일도 위에서 말씀드린데로 해야합니다. 안그러면 winsxs에서 찾습니다.
그렇지 않고 그냥 매니페스트와 dll을 동일한 폴더에 넣고 publicKeyToken를 안지워주시면 알아서 winsxs또는 로컬에서 찾습니다. 이래도 에러가 난다면 PE뷰어 등으로 빠진 dll이나 매니페스트가 있는지 확인해보세요.
예를 들면 아래와 같습니다.
Code: Select all
msvcp90.dll
msvcr90.dll
zlib1.dll
tbbmalloc_proxy.dll
tbbmalloc.dll
dbghelp.dll
MediaInfo.dll
sqlite3.dll
AnyVODServer.exe
Microsoft.VC90.CRT.manifest
zlib1.dll.manifest
tbbmalloc_proxy.dll.manifest
tbbmalloc.dll.manifest
MediaInfo.dll.manifest
sqlite3.dll.manifest
AnyVODServer.exe.manifest
-
- Posts: 980
- Joined: 2003-06-01 12:28
- Location: 모대학
- Contact:
서로 상관 없는게 아닙니다.
a.exe에서 b.dll을 사용한다고 합시다.
그런데 b.dll에서 d.dll 을 사용할ㅤㄸㅒㅤ d.dll도 마찬가지로 해줘야합니다.
또한 d.dll에서 c.dll을 사용한다고 하면 또한 마찬가지입니다.
하나의 프로세스가 생성될때 필요한 모든 바이너리가 매모리에 매핑됩니다.
이때 각각 연관되어있는 dll의 위치를 찾아서 로드해야하는데 이때 side by side assembly가 작동하게됩니다. 그런데 로드되는 dll은 각각 개별적으로 side by side assembly가 적용되므로 실행파일에서 하나만 해준다고 해서 private assembly가 성립이 안됩니다.
a.exe에서 b.dll을 사용한다고 합시다.
그런데 b.dll에서 d.dll 을 사용할ㅤㄸㅒㅤ d.dll도 마찬가지로 해줘야합니다.
또한 d.dll에서 c.dll을 사용한다고 하면 또한 마찬가지입니다.
하나의 프로세스가 생성될때 필요한 모든 바이너리가 매모리에 매핑됩니다.
이때 각각 연관되어있는 dll의 위치를 찾아서 로드해야하는데 이때 side by side assembly가 작동하게됩니다. 그런데 로드되는 dll은 각각 개별적으로 side by side assembly가 적용되므로 실행파일에서 하나만 해준다고 해서 private assembly가 성립이 안됩니다.