Ответ приходит от http://blog.kalmbachnet.de/?postid=80
Хитрость заключается в том, чтобы удалить из манифеста приложения атрибут publicKey
в assemblyIdentity
, чтобы WinSxS не использовался.
GME.exe.manifest
:
<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"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86">
</assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86">
</assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.ATL" version="9.0.30729.4148" processorArchitecture="x86">
</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>
Вложите манифест в GME.exe
(для модификации dll подставьте 1 для 2):
mt -manifest GME.exe.manifest -outputresource:GME.exe;1
Затем скопируйте необходимые библиотеки:
cp -a windows/winsxs/x86_microsoft.vc90.{atl,crt,mfc}*30729.4148*/*dll path-to-app/
Затем создайте манифесты для каждой сборки, для которых SxS не используется, и поместите их рядом с приложением.Манифесты основаны, например, на C:\Windows\WinSxS\Manifests\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2.manifest
:
Microsoft.VC90.CRT.Manifest
:
<?xml version="1.0"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86"></assemblyIdentity>
<file name="msvcr90.dll"></file>
<file name="msvcp90.dll"></file>
<file name="msvcm90.dll"></file>
</assembly>
Невозможно удалить ссылки на сборки из манифеста приложения, так как CRT жалуется, что он не загружаетсячерез SxS.
К сожалению, кажется, что необходимо изменить манифест для каждой зависимой библиотеки DLL в приложении, включая библиотеки DLL, скопированные из WinSxS, или может быть загружено несколько версий.
Вот скрипт bash, которыйработал для меня, где ~ / Documents / sxs-hack / содержит библиотеки CRT и измененные манифесты:
rm -rf bin
mkdir bin
cp -a ~/Documents/sxs-hack/* bin/
find -iname \*.dll -or -iname \*.ocx -or -iname \*.exe | while read -r file; do
cp -a "$file" bin/"$(basename $file)"
export file=bin/"$(basename $file)"
export res=$file\;2
if [ ${file:${#file}-3} = "exe" ]; then export res=$file\;1; fi
echo $file
mt.exe -nologo -inputresource:"$res" -out:extracted.manifest &&
perl -pli -e 's/(Microsoft.VC90.[^>]*)version="[^"]*"([^>]*)publicKeyToken="[^"]*"/$1 $2 version="9.0.30729.4148"/g;' extracted.manifest &&
mt -nologo -manifest extracted.manifest -outputresource:"$res"
regsvr32 /s "$file" || true
done