Как программно собрать задачу InstallShield msbuild на win2008 x64? - PullRequest
2 голосов
/ 14 мая 2009

У меня проблема с использованием MSBuild и InstallShield на Win 2008 Server x64. Я пытался собрать проект InstallShield с помощью задачи MSBuild, которую предоставила команда InstallShield, и они хорошо работают, если я запускаю msbuild из C: \ Windows \ Microsoft.NET \ Framework \ 3.5 \, но когда я пытаюсь запустить его из C: \ Windows \ Microsoft. NET \ Framework 64 \ 3.5 \ Я получил ошибку:

«InstallShield.Tasks.InstallShield» задача не может быть загружена из сборка c: \ Program Files (X86) \ MSBUILD \ InstallShield \ 2009 \ InstallShield.Tasks.dll. Не удалось загрузить файл или сборку 'file: /// c: \ Program Files (X86) \ MSBUILD \ InstallShield \ 2009 \ InstallShield.Tasks.dll» или одна из его зависимостей. Попытка был сделан, чтобы загрузить программу с неверный формат. Подтвердите, что декларация правильная, и что сборка и все ее доступны зависимости.

И будет нормально использовать «обычный» путь Framework вместо пути x64, но, к сожалению, мне нужно использовать MSBUILD программно, используя его движок, и он возвращает только 2 набора инструментов, один для 2.0 версии Framework и один для 3.5. Но оба находятся в папке Framework64 ... Я попытался добавить свой собственный набор инструментов с путем к «обычному» каталогу Framework. Я попытался сделать это через реестр и программно, но это не сработало - DefaultToolsVersion был установлен на мое собственное значение, Path обращается к Framework, Toolset с моей версией был добавлен в коллекцию toolsets. Но по какой-то причине я все еще получаю то же сообщение , Код, являющийся проектом сборки:

        Project project = new Project(engine);
        //Toolset customToolset = new Toolset("4.0", @"c:\windows\Microsoft.Net\Framework\v3.5\");
        //engine.Toolsets.Add(customToolset);
        //engine.DefaultToolsVersion = "4.0";

        project.Load(args[0]);

        MSBuildLogger logger = new MSBuildLogger();
        engine.RegisterLogger(logger);

        bool res = engine.BuildProjectFile(args[0]);

У кого-нибудь есть идеи, что мне делать, чтобы это работало?


Кажется, я решил проблему, чтобы скомпилировать свое приложение для платформы x86, а не AnyCPU .... Но может быть, есть другое решение?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Корень вашей проблемы в том, что сборка Macrovision.InstallShield.Tasks.dll небезопасна по типу (управляемый и собственный код смешанный / IJW) и работает только для архитектуры x86. Macrovision не удалось выполнить хорошую модульную сборку взаимодействия для конкретных архитектур. Задачи в Macrovision.InstallShield.Tasks.dll зависят от встроенных инструментов для создания пакета MSI. Эти нативные инструменты доступны только для архитектуры x86, отсюда и зависимость.

Macrovision должна была создать сборку задач по типу (AnyCPU / PURE) для MSBuild и развернуть код, специфичный для архитектуры, и вызовы в сборки взаимодействия для конкретных архитектур, особенно x86 и AMD64. Таким образом, любой вариант MSBuild или любого другого потребителя сборки задач будет работать (конечно, если существуют конкретные сборки взаимодействия для данной архитектуры).

Вероятно, лучший способ обойти вашу проблему - это скомпилировать ваш проект как AnyCPU и выполнить 32-битный MSBuild. Или запустите 32-разрядный CLR или процесс, а затем используйте сборку Macrovision.

1 голос
/ 14 мая 2009

Да, сборка InstallShield является 32-разрядной и, соответственно, устанавливает свою поддержку MSBuild только в 32-разрядную папку. Ваш проект MSIL работает как 64-разрядный на компьютере с 64-разрядной версией, так что на данный момент ваше решение по созданию вашего сборщика x86, вероятно, является лучшим, хотя в будущем сама MSBuild может обойти это.

Если в какой-то момент вам нужно 64-битное больше, чем нужно для задачи InstallShield MSBuild, вы можете использовать задачу Exec со сборкой из командной строки.

...