2012-06-21 94 views
26

我无法在VS2010中为Windows服务项目创建安装项目。它失败,此错误:找不到必需的文件'setup.bin'

Could not find required file 'setup.bin' in 'C:\MyProject\Engine'.

我的环境是Windows 7专业版64位的Visual Studio 2010版本10.0.40219.1 SP1Rel

我已经下载Microsoft Windows SDK for Windows 7 and .NET Framework 4,修复,然后重新启动,然后安装除Visual C++编译器外的未经检查的组件,然后安装KB2519277

这些都是现有的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\3.5 
    Path = c:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bootstrapper\ 

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\4.0 
    Path = c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\ 

这些都是现有的文件:

C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Engine\setup.bin 

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Engine\setup.bin 

现有的解决方法是将引擎目录复制到项目目录,但是这必须是每次你做一个新项目都会完成。

这怎么解决?

+1

您是否尝试将此目录添加到环境值PATH中? –

+1

@AtillaOzgur刚刚尝试过,仍然出现错误。 – Stijn

回答

22

使用进程监视器我发现,在尝试访问路径之前,使用DLL来检索此路径。以下可能是临界合法的,但我仍然想分享我的发现。

该DLL位于C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll,正在使用的类是Microsoft.Build.Tasks.Deployment.Bootstrapper.BootstrapperBuilder。使用你最喜欢的反汇编工具,你可以发现最终三次尝试获取路径。

  1. HKLM \ SOFTWARE \微软\ GenericBootstrapper \ 11.0 \路径
  2. HKLM \ SOFTWARE \ Wow6432Node \微软\ GenericBootstrapper \ 11.0 \路径
  3. Environment.CurrentDirectory

我不确定为什么它说11.0,据我记得VS 2012之前还没有安装在这台机器上。

因此,在SDK安装程序中存在一个错误,或者DLL中存在一个错误。无论哪种方式,创建11.0注册表项并添加该值可解决此问题。注意:必须重新启动Visual Studio,因为尝试检索路径后,它将被缓存。

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\11.0] 
"Path"="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bootstrapper\\" 
Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\11.0] 
"Path"="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bootstrapper\\" 
+0

我有一个类似的问题,除了我看到与你稍有不同的行为。我将MSBuild的'ToolsVersion'改为'4.0',因此:'

+0

也@ ta.speot。是......你怎么*改变你的MSBuild ToolsVersion?你在编辑什么文件? – JoelFan

+3

因为我没有“SOFTWARE \ Microsoft \ GenericBootstrapper”,我使用了第二个键(带有“Wow6432Node”),我也改变了v7 .0A到v8.1A,因为我有Visual Studio 2013更新1 – JoelFan

14

之前下降了兔子洞,验证您需要引导程序。如果您不这样做,那么您可以通过执行以下任一操作将其关闭。这也将解决错误。

的GUI方式:

  1. 右键单击该项目
  2. 点击Properties
  3. 点击左侧
  4. Publish选项卡单击Prerequisites...按钮
  5. 取消选中Create setup program to install prerequisite components

Project Properties

这个答案来自这个post

的手动编辑csproj文件方式:

  1. 添加<BootstrapperEnabled>false</BootstrapperEnabled>到第一<PropertyGroup>元素
+1

谢谢 - 它也可以通过在csproj –

+0

@rudolf_franek中直接设置 false来完成,在csproj中应该在哪里添加''元素? –

+0

只需在csproj –

5

的底部我曾与一个TFS同样的问题建立。

您可以通过设置定义生成的MSBuild的参数在Visual Studio版本解决问题:

/property:VisualStudioVersion=12.0; 

MSBuild arguments in build definition

0

我的解决方案的问题:不能公布,因为将setup.bin不能被发现

当在vs2008中使用PUBLISH向导时,无法发布应用程序,因为找不到setup.bin。


简短的回答是:

engine文件夹粘贴到被在VS2008 IDE中的ERROR消息所指示的位置。

engine文件夹可以在Microsoft SDKs文件夹中找到。


长的答案是:

在我的情况下,VS2008在C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\engine\一直在寻找的setup.bin。

此位置在vs2008 IDE中的错误中指示。

engine文件夹不存在于上述位置,因为engine文件夹不在那里。

engine文件夹实际上在C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Engine

engine文件夹的位置是通过搜索注册表中的setup.bin

的发生,发现我从Microsoft SDKs文件夹复制engine文件夹并将其粘贴到Microsoft Visual Studio 9.0文件夹。

此文件夹复制解决了问题,并允许我发布应用程序。

下面是我的具体步骤:

  1. 在注册表中搜索的setup.bin

  2. 当将setup.bin在注册表中被发现,检查重点和注意的文件夹位置将setup.bin(对我来说,这是C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Engine

  3. 在VS2008 IDE,看在错误窗口,并记下的setup.bin错误的文件夹位置(在我的情况,这是C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\engine\

  4. VS2008的IDE期待的setup.bin是在C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\engine\,但 这engine文件夹并没有从C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Engine存在

  5. 复制engine文件夹,并在C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\

  6. 这个文件夹到IDE中粘贴文件夹
1

这是一个多步骤的解决方案。

首先确保您安装了.Net SDKs。

然后确保以下注册表项存在: HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\GenericBootstrapper\11.0

它必须包含一个具有价值指向的引导程序的位置的“路径”条目: C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\

下面的PowerShell脚本这是否对你来说:

$registryPath = "Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\GenericBootstrapper\11.0" 
$registryValue = "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\" 
function CreateRegistryValues { 

    if(-not (Test-Path $registryPath)) 
    { 
     Push-Location 
     Set-Location -Path Registry::HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\GenericBootstrapper 
     # First add the registry item 
     New-Item -Name '11.0' -Value $registryValue 
     #Then add a property on it for 'Path' and the folder in bootstrapper that contains the 'Engine' folder 
     New-ItemProperty ` 
      -Path $registryPath ` 
      -Name 'Path' ` 
      -PropertyType String ` 
      -Value $registryValue 
     Pop-Location 
    }else{ 
     Write-Warning "You already have the registry key ($registryPath) set. `r`n No action was taken `r`n " 
    } 
} 

最后,你必须复制作为Visual Studio工具一部分包含的'Engine'文件夹的内容到注册表值中列出的位置:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\" 
相关问题