如何在win2008 x64上以编程方式构建InstallShield msbuild任务?

时间:2009-05-14 05:06:56

标签: msbuild 64-bit installshield

我在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 \我有一个错误:

  

“InstallShield.Tasks.InstallShield”   任务无法从中加载   程序集c:\ Program Files   (86)\ MSBUILD \的InstallShield \ 2009 \ InstallShield.Tasks.dll。   无法加载文件或程序集   'file:/// c:\ Program Files   (86)\ MSBUILD \的InstallShield \ 2009 \ InstallShield.Tasks.dll”   或其中一个依赖项。一次尝试   是用来加载程序的   格式不正确。确认一下    声明是正确的,   那个组件和它的全部   依赖项可用。

可以使用x64路径的“通常”框架路径,但不幸的是我需要使用其引擎以编程方式使用MSBUILD, 它只返回2个工具集,一个用于2.0版本的Framework,另一个用于3.5。但两者都位于Framework64路径下......我尝试使用“通常”Framework目录的路径添加我自己的工具集。我试图通过注册表和programmaticaly来做但它没有用 - DefaultToolsVersion设置为我自己的值,Path看起来框架,我的版本的工具集被添加到工具集集合。但由于某种原因我仍然得到相同的消息。 构建项目的代码:

        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 个答案:

答案 0 :(得分: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的程序集。

答案 1 :(得分:1)

是的,InstallShield构建版本是32位,并且相应地仅将其MSBuild支持安装到32位位置。你的MSIL项目在x64机器上运行为64位,所以现在你的构建器x86的解决方案可能是最好的,尽管将来MSBuild本身可以解决这个问题。

如果在某些时候您需要的64位比您需要的InstallShield MSBuild任务多,那么您的另一个办法就是使用命令行构建的Exec任务。