2010-02-03 2 views
7

У меня есть приложение MFC, которое я пытаюсь установить для развертывания. Кажется, что это зависит от файлов msvcr90.dll ',' msvcp90.dll 'и' mfc90.dll '. Каков правильный способ распространения этих файлов?Правильный способ распространения файлов времени исполнения VC++

Я не могу использовать модули слияния, поскольку мой установщик не поддерживает их. Я знаю, что могу запустить VCRedist_x86.exe, но я не хочу этого делать по разным причинам.

Насколько я могу видеть, единственной альтернативой является установка файлов как сборных сборок Side-by-Side. Это верно?

В соответствии с http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx правильным способом установки частной сборки является копирование папок Microsoft.VC90.CRT и Microsoft.VC90.MFC в ту же папку, что и исполняемый файл. Это правильный способ решить проблему? Он работает, но, похоже, немного 1990-х годов копирует системные файлы таким образом. Может ли кто-нибудь показать мне пример другого приложения (или, по крайней мере, демонстрационного проекта), который это делает?

Наконец, когда мне нужно беспокоиться о распространении файла .manifest для моего приложения? Должен ли я явно устанавливать XML-файл, или он каким-то образом встроен в мой исполняемый файл?

+0

FWIW Я задал аналогичный вопрос о доставке DLL CRT. http://stackoverflow.com/questions/2131093/distributing-the-visual-c-runtime-libraries-msvcrt – Rob

+0

Добро пожаловать в DLL Hell, глава 3. * (В первых двух главах обсуждаются проблемы с расположением файлов и проблемы с версией.) –

ответ

1

Обычно я бы сказал, что вы должны установить требуемый распространяемый на целевой машине, так как это «чистый путь». Но вы также можете сделать это в стиле 90-х годов. Это сильно зависит от того, какой CRT/MFC lib вы используете для создания приложения. Это можно проверить в файле манифеста. Вы также можете заставить приложение связываться с указанным lib. Без какой-либо определить VS2008 обычно связывает 9.0.21022.8 с

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 

самые последние ЛИЭС принимаются. Вы можете также связать с указанной версией:

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

и/или

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

Так что, если вы хотите сделать это в стиле 90-ых, скопируйте файлы из C:\Windows\Winsxs\ и взять библиотеки DLL из этой папки вы связанный с, например от amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4, если вы используете CRT для приложения x64 или эквивалент x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d для x86-версии CRT.

+1

uhm, #define не принимает оператор присваивания ... – kusma

1

Вы также можете рассмотреть статическую связь как с MFC, так и с CRT, тогда вам нужно только отправить ваши EXE-файлы. Однако есть и плюсы и минусы этого.

+0

Это правда, но [Microsoft обескураживает статическую привязку] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

1

Я бы сказал, что этого достаточно, чтобы поместить эти dll вместе с вашим exe, потому что текущий путь - это то место, где они в первую очередь ищут.

Конечно, вы должны стремиться к установке распространяемого типа, поскольку это более безопасный путь.

+0

Использование перераспределяемой информации - [текущая рекомендация Microsoft] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

+0

Это правильный ответ. [Microsoft рекомендует] (https://msdn.microsoft.com/en-us/library/ms235299.aspx) либо установить распространяемое, либо установить DLL вместе с исполняемым файлом.Цитируйте: «Чтобы развернуть распространяемые файлы Visual C++, вы можете использовать распространяемые пакеты Visual C++, которые включены в Visual Studio или использовать распространяемые модули слияния, или вы можете напрямую устанавливать распространяемые библиотеки Visual C++ в локальной папке приложения, которая является папкой который содержит исполняемый файл приложения. " – Marc