VC++ 2005 배포 질문입니다.

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

VC++ 2005 배포 질문입니다.

Post by 비회원 »

private assembly 형태로 배포를 하려고합니다.
그래서 실행파일 manifest,
Microsoft.VC80.CRT.manifest, 필요한 DLL을
같은 폴더에 포함했습니다.
그런데 실행을 하면 여전히 에러가 납니다.
같은 폴더에 포함했는데도,
WinSxS에서 찾는거 같습니다.
뭔가를 더 해줘야 하나요?
chadr
Posts: 980
Joined: 2003-06-01 12:28
Location: 모대학
Contact:

Post by chadr »

Microsoft.VC80.CRT.manifest 파일과 기타 모든 매니페스트 파일을 여셔서 private로 구성할 dll에 대한 publicKeyToken 항목을 지워주셔야합니다.

또한 실행파일도 매니페스트를 외부로 만들게 하신다음에 여셔서 publicKeyToken 항목을 지워주셔야지만 됩니다.
비회원

Post by 비회원 »

publicKeyToken 항목을 지워도 마찬가지 입니다.
그리고 다른 온라인 게임의 매니페스트 파일을 열어봐도,
publicKeyToken 항목이 있는것을 보면
publicKeyToken 항목과는 별 상관이 없는듯 합니다.
chadr
Posts: 980
Joined: 2003-06-01 12:28
Location: 모대학
Contact:

Post by chadr »

상관이 있습니다. 그걸 안지워주시면 죽었다 깨나도 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이나 매니페스트가 있는지 확인해보세요.

예를 들면 아래와 같습니다.

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
위와 같이 전부 매니페스트가 존재하고 매니페스트 안에는 publicKeyToken가 없어야지 private로 구성이 완료됩니다.
비회원

Post by 비회원 »

답변감사합니다.

그러면 해당 실행파일에서 사용하는 모든 dll의
dll파일과 매니페스트 파일이 같이있어야하고, publicKeyToken도
모두 지워줘야 하는군요.
만약 하나라도 publicKeyToken을 지워주지 않으면
private assembly가 되질 않는군요.

그런데 왜,
서로 상관도 없는 dll의 publicKeyToken에
영향을 받는거죠?
비회원

Post by 비회원 »

비회원 wrote:답변감사합니다.

그러면 해당 실행파일에서 사용하는 모든 dll의
dll파일과 매니페스트 파일이 같이있어야하고, publicKeyToken도
모두 지워줘야 하는군요.
만약 하나라도 publicKeyToken을 지워주지 않으면
private assembly가 되질 않는군요.

그런데 왜,
서로 상관도 없는 dll의 publicKeyToken에
영향을 받는거죠?
공통 Dll를 써서 그런게 아닐까요?
chadr
Posts: 980
Joined: 2003-06-01 12:28
Location: 모대학
Contact:

Post by chadr »

서로 상관 없는게 아닙니다. :)
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가 성립이 안됩니다.
비회원

Post by 비회원 »

답변 감사합니다.
다른 인터넷사이트나 블로그에는
private assembly 할때, DLL과 매니페스트를 포함만 하면 된다고 되있었습니다.
publicKeyToken 얘기는 없었구요.
예제 매니페스트에도 publicKeyToken이 있는 채였구요.

chadr님의 답변에
관련 자료를 찾아 보았는데, 관련 자료가 보이질 않았습니다.

아뭏든 답변 감사합니다.
좋은 정보를 얻었습니다.
Locked