블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

프로그램밍한 후 컴파일해보면 잘되는것이 옛날 VS6 이나 VS7 처럼 사용한 DLL 를 같이 포함해서 다른 컴퓨터로 가져와 실행하면 안되는 경우가 있다.

바로 Side by side assembly라는 것때문이라는거 때문인데.. 윈도우 디렉토리 밑에 WinSxS(Windows Side by Side) 폴더에 추가되면서 복잡하게 연결되었다는것이다.

 

해결하는 방법은 몇가지 있는데

1. 배포하려는 컴퓨터에 재배포 패치를 설치해주는거(작업했던컴퓨터가 아니다.)

Microsoft Visual C++ 2005 재배포 가능 패키지(x86)
Microsoft Visual C++ 2005 SP1 재배포 가능 패키지(x86)
Microsoft Visual C++ 2008 재배포 가능 패키지(x86)

 

 

2. 컴파일하면 나오는 .manifest 파일 안에 DLL 버젼을 파악후

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT 에서 복사해서 같이 배포하는방법 참고로 그안에있는 .manifest 도 같이 포함해야한다.

ex)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

처럼 보면  Microsoft.VC80.DebugCRT 과  Microsoft.VC80.DebugMFC 사용되었기때문에

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT 폴더에 있는 파일과 C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC 파일을 복사해주면된다. 만약 디버그 버젼을 배포한다면 redist 폴더 안에 Debug_NonRedist 폴더 에 있는 걸 복사해주면된다.

 

3. 인스톨쉴드(Install Shield),나 설치 프로젝트를 이용한다.

4. 최신 버젼 .net Framework를 설치한다.

5. MFC 라면  정적 라이브러리에서 MFC 사용으로 컴파일해서 DLL를 실행파일에 포함시킨다.

 

참고1.:  http://msdn.microsoft.com/ko-kr/library/ms235285(VS.80).aspx

           http://gs4096.blogspot.com/2008/06/vs2005.html

           http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

참고2.: http://microdev.pe.kr/69

 참고2 - 내용-

 Side by Side Assembly는 dll hell을 해소하기 위해 VS2005부터 지원하기 시작한 개념으로,
한 PC에서도 서로 다른 버전의 dll을 사용하는 어플을 동시에 실행시킬 수 있게 한다.
예를 들어, 버전 1.0.1인 dll A를 사용하는 어플과 1.0.2인 dll A를 사용하는 어플이 있을 때,
dll A를 버전별로 별도로 관리해서 각 어플이 해당 dll을 올바로 런타임에 링크하게 한다.
이 방식은 어떻게 보면 linux에서 so파일을 쓰지만 사실상 버전별로 다른 so파일을 쓰는 것과 유사한 점이 있다.

VS2005부터는 빌드시에 항상 manifest파일이 생성되며 이는 별도 파일로 생성하거나 dll 내부에 포함시키고 있다.
각 manifest파일에는 자신이 빌드시에 사용한 하위 dll들의 버전 정보등이 포함된다.
실행시에는 dll loader가 manifest파일을 보고 어떤 버전의 dll을 쓸지 결정해서 loading한다.


Visual studio에서 제공하는 CRT등의 dll은
    %WINDIR%\WinSxS\x86_Microsoft.VC90.CRT_<version>
과 같은
형태의 디렉토리에 각각 저장되며
    %WINDIR%\WinSxS\Manifests\x86_microsoft.vc90.crt_<version>.manifest
에 인스톨 정보가 남게 된다. 그리고
    %WINDIR%\WinSxS\Policies\x86_policy.9.0.Microsoft.VC90.CRT_<version>.policy
위와 같은 policy 파일을 통해 redirection도 가능하다.

보통의 경우에 VS2005를 설치하지 않은 PC에서 실행하기 위해서는 redistributable package라는 것을 다운받아 설치하면 CRT등의 dll이 해당 디렉토리에 설치되게 된다. 하지만, debug모드용 dll들은 이런 package에 포함되지 않은 듯 하다. 그래서 수동으로 필요한 파일들을 커파해야 하며, dll과 manifest외에 위의 policy와 인스톨 정보도 함께 카피해야 정상적으로 로딩에 성공한다.
그외에 trouble shooting 자료도 참조할것.

 

원문)http://raballe.tistory.com/entry/Side-by-Side-Assembly

반응형
Posted by blueasa
, |