У нас есть 32-битное смешанное приложение C/C++, которое мы пытаемся развернуть в мире. Он, естественно, использует библиотеки времени выполнения C и C++. Мы используем VS 2005Конфигурация сборки Microsoft для 32-разрядного смешанного приложения C/C++
манифеста построен VS2005 заключается в следующем:
<?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.CRT" version="8.0.50727.42" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Мы грузим это как файл в том же каталоге, что и «приложение», названный (изменены, чтобы защитить невинных) "application.exe.manifest".
На первый взгляд это разумно. Но, при установке на некоторых системах , мы получаем сообщение, когда «application.exe» запускается:
Это приложение не удалось запустить из-за конфигурации приложения неверен
Один из способов вылечить это для запуска VCRedist_x86.exe из MSDN. (К сожалению, в то время как мы можем запустить его, мы не знаем точно, что это делает. Это, как представляется, парковочные библиотеки DLL в SxS каталогах. Но что еще это делает?)
а) МС docs, похоже, указывают, что сборка должна иметь assemblyIdentity тег непосредственно под блоком , который сам именует приложение. Это явно отсутствует здесь, но манифест частично работает в том, что , если мы его удалим, приложение не запускается, даже если библиотеки DLL присутствуют.
b) Замечательно, что в сборке не упоминается DLL C runtime. Нужно ли просто добавить это вручную?
c) Мы не хотим зависеть от того, присутствует ли на целевой машине подходящая DLL версии. Предполагая, что сборка дает понять, какие DLL использовать, как мы можем гарантировать, что DLL, которые нам нужны, находятся в целевой системе? (В частности, мы не хотим запускать VCRedist или просить нашего клиента сделать это). Перед тем, как были собраны сборки, мы решили эту проблему, просто разместив библиотеки C и C++ в том же каталоге, что и файл .exe приложения, и Windows сначала увидит их, чтобы забрать их. Можем ли мы по-прежнему отправлять C и C++ DLL в один и тот же каталог? Я не могу понять из документов MS, которые могут найти, как SxS находит соответствующие зависимые сборки.
Любая помощь приветствуется.
Спасибо за предложение. Это вариант. Но я хотел бы понять, как работает манифест. –