vcのmanifestに悩まされる

R6034が出て頓挫中。
Blenderのビルドに使ったpython26.dllのmanifestとswigで作ったエクステンションのmanifestが合っていないっぽい?

この際、埋め込んだmanifestを取り出してどこがおかしいか調べられるようになりたいところだがどうも良く判らん。
nmakeとかコマンドライン系の余計なことはせずに大人しくvc使っとけという暗黙のメッセージを感じる。
vcのmanifestはなんか腹が立つ。

Side-by-Side Assemblies

http://msdn.microsoft.com/en-us/library/ms235624%28VS.80%29.aspx
http://msdn.microsoft.com/ja-jp/library/ms235342%28VS.80%29.aspx
http://ja.wikipedia.org/wiki/%E5%88%86%E9%9B%A2%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8Side-by-Side%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA

どうやらvc8(vc 2005)あたりから導入された機能で、同じ名前でバージョン違いを複数インストールできるようになった代わりに特定のバージョンをmanifestで選択する必要ができた。manifestはexeやdllに埋め込まれる。
Side-by-Sideに対応したdll(msvcr90.dll, msvcp90.dll, msvcm90.dllなど)はC:\WINDOWS\system32等ではなくて
C:\WINDOWS\WinSxS
下にインストールされる(共有アセンブリ)。

用語

大雑把に

Side-by-Sideアセンブリ

マニフェストが埋めてあるexeもしくはdll

分離アプリケーション

Side-by-Sideアセンブリだけで構成されるアプリのこと。
字面からはわりと意味不明だが英語のisolated applicationの直訳っぽい。

manifestを作る

リンカで/MANIFESTFILE:オプションを指定する。
2008 express editionではデフォルトで
プロジェクトのリンカ - マニフェストファイルにて
$(IntDir)\$(TargetFileName).intermediate.manifest
になっている。
中身はxmlデバッグビルドだと

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

対応するdllは
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456
にインストールされている。

manifestを埋め込む

http://msdn.microsoft.com/ja-jp/library/ms235542%28v=VS.80%29.aspx
http://msdn.microsoft.com/ja-jp/library/ms235531%28v=VS.80%29.aspx
http://msdn.microsoft.com/ja-jp/library/ms235591%28VS.80%29.aspx
mt.exeでxmlから埋め込むか、manifest(xml)からリソースを作ってリンクする2通りの方法があるらしい。

vcでは後者の方法を使っていて(ビルドログを参照)
hoge.exe.embed.manifest(xml)
から
hoge.exe.embed.manifest.res(リソース)を作成していた。
この時、以下の内容のrcファイルを一時的に作成してリソースをコンパイルしているっぽい。

1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ ".\\Debug\\hoge.exe.embed.manifest"

何かlink.exeを2回呼び出していて1回目で
hoge.exe.intermediate.manifest
を出力して
2回目で、オブジェクトをリンクしてexeを出力しているっぽい。
要するに

link 
↓
  intermediate.manifest
↓
mt
↓
  embed.manifest
↓
rc
↓
  embed.manifest.res
↓
link
↓
リソースとして埋め込み

埋め込まれたmanifestを確認するには?

manifestはリソースなのでリソースを読む手段が要る。
XN Resource Editor 日本語版
http://www.nihongoka.com/filemirror
を使う。

C:\WINDOWS\system32\python26.dllを開いてみた。


ここまでやったがswigで作ったpydをうまく動作させることはできなかったのでstatic runtimeを使う手に逃げたw
バイナリ配布が有りうる場合はmanifestが解決していてもstaticの方が無難だし。