我有xyz.csproj,其中有自定义构建任务目标。然后,目标文件指向我的自定义构建任务程序集(它是在AnyCPU中构建的)。我在构建任务程序集中有一些代码需要加载x64以执行某些验证。
当我在Visual Studio 2013中构建xyz.csproj时,我在自定义构建任务程序集尝试加载x64 dll时抛出了一个错误的图像格式异常。 我在构建任务代码中做了一条日志消息,它将x86输出到visual studio输出窗口。
如何强制我的自定义构建任务代码在x64中运行?
我尝试在目标文件中的UsingTask节点上指定Architecture =“x64”属性,还尝试了指定here in this msdn article的MSBuildArchitecture =“x64”。似乎没什么用。
如何解决此问题?
答案 0 :(得分:3)
Visual Studio 2013使用MSBuild 12.0,默认情况下使用32位工具链。因此,它只能加载32位(或AnyCPU)任务。
根据this article,您可以在C:\Program Files (x86)\MSBuild\12.0\Bin\amd64
找到64位工具链。如果在命令提示符下启动它,它可能会消耗64位(或任何CPU)任务。
Architecture
属性用于设置与位数相关的任务。如果你确实有依赖于位的任务,请确保配置32位和64位,这样无论使用哪个MSBuild工具链(32位或64位),都可以找到并执行任务。提供仅64位的任务真是个坏主意。
答案 1 :(得分:2)
根据我引用的msdn文章,实际上可以在Visual Studio 2013中运行自定义构建任务 以 x64显式模式运行。现在构建任务代码能够加载x64 dll并执行我需要运行的验证。
以下是我必须将自定义目标文件更改为:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="SuperCustomTask"
AssemblyFile="$(PathToCustomTaskDllEnvVariable)\SuperCustomTasks.dll"/>
<Target Name="SuperCustomTask">
<TCXBuildTask PlatformName="$(Platform)"
ProjectName="$(MSBuildProjectFullPath)"
MSBuildRuntime="*"
MSBuildArchitecture= "x64"/>
</Target>
</Project>
我在另一个文本编辑器(我的记事本++)中打开此目标文件的事实会导致异常“在另一个程序中更改配置文件”,并且构建将失败。
关闭所有打开目标文件的编辑器后,VS能够很好地执行它。经验教训。
感谢@ Lex-Li和@Seva Titov的投入