2

我在 Win 2008 Server x64 上使用 MSBuild 和 InstallShield 时遇到问题。我尝试使用 InstallShield 团队提供的 MSBuild 任务构建 InstallShield 项目,如果我从 C:\Windows\Microsoft.NET\Framework\3.5\ 运行 msbuild,它们运行良好,但是当我尝试从 C:\Windows\Microsoft 运行它时。 NET\Framework 64 \3.5\ 我有一个错误:

无法从程序集 c:\Program Files (x86)\MSBUILD\InstallShield\2009\InstallShield.Tasks.dll 加载“InstallShield.Tasks.InstallShield”任务。无法加载文件或程序集 'file:///c:\Program Files (x86)\MSBUILD\InstallShield\2009\InstallShield.Tasks.dll' 或其依赖项之一。试图加载格式不正确的程序。确认声明正确,并且程序集及其所有依赖项都可用。

并且可以使用“常规”框架路径而不是 x64 路径,但不幸的是我需要使用 MSBUILD 以编程方式使用它的引擎,它只返回 2 个工具集,一个用于 2.0 版本的框架,一个用于 3.5 版本。但两者都位于 Framework64 路径下...我尝试使用“通常”框架目录的路径添加我自己的工具集。我尝试通过注册表和编程方式执行此操作,但它不起作用 - DefaultToolsVersion 设置为我自己的值,路径查看框架,带有我的版本的工具集已添加到工具集集合中。但由于某种原因,我仍然收到相同的消息. 构建项目的代码:

        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 编译我的应用程序的问题......但可能还有另一种解决方案吗?

4

2 回答 2

2

您的问题的根源是程序集 Macrovision.InstallShield.Tasks.dll 是类型不安全的(托管和本机代码混合/IJW)并且仅适用于 x86 架构。Macrovision 在这里未能为特定架构进行良好的互操作程序集模块化。Macrovision.InstallShield.Tasks.dll 中的任务依赖于本地工具来构建 MSI 包。这些本机工具仅适用于 x86 架构,因此存在依赖性。

Macrovision 应该为 MSBuild 制作了一个类型安全的(AnyCPU / PURE)任务程序集,并部署特定于架构的代码并调用特定架构的互操作程序集,最突出的是 x86 和 AMD64。这样,任何类型的 MSBuild 或任务程序集的任何其他使用者都可以工作(当然,只要存在给定体系结构的特定互操作程序集)。

解决问题的最佳方法可能是将项目编译为 AnyCPU 并执行 32 位 MSBuild。或者启动一个 32 位 CLR 或进程,然后使用 Macrovision 的程序集。

于 2011-12-01T12:29:01.580 回答
1

是的,InstallShield 版本是 32 位的,因此仅将其 MSBuild 支持安装到 32 位位置。您的 MSIL 项目在 x64 机器上以 64 位运行,因此目前您的构建器 x86 的解决方案可能是最好的,尽管将来 MSBuild 本身可能会解决这个问题。

如果在某些时候您需要的 64 位多于 InstallShield MSBuild 任务,您的其他办法是使用带有命令行构建的 Exec 任务。

于 2009-05-14T14:46:16.057 回答