在64位的构建服务器上,构建32位网站项目

19

我有一个VS 2010的解决方案,其中包含一个网站和一个Web服务。该Web服务引用了一个COM dll,在我们的64位构建服务器上构建该解决方案时会出现问题。出现了典型的32/64位错误:

ASPNETCOMPILER:错误ASPCONFIG:无法加载文件或程序集“xxx”或其某个依赖项。尝试加载格式不正确的程序。

当我使用32位aspnet_compiler编译网站时,可以成功构建。那么,如何指定网站应该以32位方式构建呢?在VS中的配置管理器只能让我选择Any CPU,因此我无法将其更改为x86以用于此网站...

谢谢。


我遇到了同样的问题,与“vjslib”有关。它在.NET 4.0下存在已知问题。 - Vilx-
6个回答

8
您可以使用以下命令。实际上,在这种情况下,您正在使用ASPNetCompiler x86版来构建自己的项目。
call "C:\Program Files\Microsoft Visual Studio 2008\VC\vcvarsall.bat" x86
MSBuild MySolutiuon.sln 

您也可以使用x86_amd64来适用于任何CPU。请注意,您可以像下面这样加载配置文件,而不是使用MSBuild

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Target Name="PrecompileWeb">
     <AspNetCompiler
         VirtualPath="/MyWebSite"
         PhysicalPath="c:\inetpub\wwwroot\MyWebSite\"
         TargetPath="c:\precompiledweb\MyWebSite\"
         Force="true"
         Debug="true"
         FixedNames="True"
     />
 </Target>
</Project> 

要使用上述配置,您需要使用以下内容:
MSBuild your.xml /p:Configuration=Release

1

@Vilx,使用依赖项查找器来确定其进度。 我猜测它可能会停在 vjsnativ.dll。如果它只到达这个地方,那么请尝试 此解决方法

否则,您将不得不追踪程序找不到的每个 DLL,并将它们复制到您的程序(或其 bin)目录中。


我知道这个解决方法。不幸的是,我无法将此代码注入到aspnet_compiler.exe中,因为它是试图加载J#(用于编译目的)的程序。 - Vilx-
aspnet_compiler需要它吗?vjslib的哪个版本?您是否尝试使用依赖项查找器(或任何其他方法)跟踪它为什么需要它? - musaul
它需要这个是因为我的网站需要它。我已经引用了它。所以,为了编译我的网站,aspnet_compiler必须加载vjslib来查看其中的内容。但是它无法加载,因为vjsnativ.dll存在问题。至少这是我最好的猜测。以下是错误消息:ASPNETCOMPILER:error ASPCONFIG:无法加载文件或程序集“vjslib”或其某个依赖项。尝试加载格式不正确的程序。 - Vilx-
是的。但是当它只被编译时,它如何帮助呢?此时它无法运行! - Vilx-
你说得没错,但是找到正确的dll版本很重要。你打算在同一台机器上部署32位和64位版本吗? - musaul
显示剩余4条评论

0

谢谢回复Simon。然而,我知道它可以构建为32位,但问题是如何告诉64位构建服务器使用适当的编译器将其构建为32位。看起来似乎没有这样的选项... - Col
@Col - 好的,我没有真正理解这个问题 :-). 我的理解是VS本身不使用aspnet_compiler.exe,而是使用ClientBuildManager类,在进程中。在你的情况下,是什么启动了aspnet_compiler.exe?你能追踪到吗?你确定是VS吗? - Simon Mourier

0

在Visual Studio中,右键单击您的Web项目。
选择“属性”。
单击左侧的“生成”选项卡。
在“常规”下,将“平台目标”更改为“x86”,以便始终构建32位。

现在,当您执行此操作时,您可能会注意到在同一“生成”选项卡上,“配置”设置为“Active(Debug)”。 您需要将该下拉列表更改为您拥有的所有不同配置设置(即“Release”,“QA”,“Staging”,“Demo”等),并对每个配置进行相同的“平台目标”更改为“x86”。

完成后别忘了点击“保存”按钮 - 如果您在开发计算机上,请记得将其设置回“Debug”。

这可能是为什么它只能在您的计算机上构建成功,而不能在构建服务器上构建成功的原因,因为构建服务器很可能设置为针对不同配置进行构建 - 这是正确的,因为您不应该在构建服务器上使用“Debug”配置。


谁给我的答案点了踩,能否留下评论说明原因?虽然它可能对你或提问者没有帮助,但我认为对于通过谷歌搜索类似问题的其他人可能会有所帮助(因为我自己也犯过这个错误)。 - MikeTeeVee
抱歉,我有点匆忙。海报提到:“VS中的配置管理器只允许我选择任何CPU,因此我无法将其更改为x86以用于此网站”。这适用于网站项目:您无法更改架构。因此,您的过程不起作用。要使其起作用,您应将项目更改为Web应用程序项目,如我的答案中所述。 - johanvdw
1
谢谢你的解释,我非常感激。我没有注意到他们没有使用Web应用程序之间的区别,发现得好。但下次,你可能想发表评论,让回答者有机会更新他们的答案或完全删除它——这只是一种礼貌。投票否决了我的完美记录,这让我很难过。:( 我通常只会对那些根本不知道自己在说什么,给出可能会把人搞砸的非常糟糕的建议的人投票否决。但每个人都有自己的选择,对吧。 - MikeTeeVee
我无法取消我的负投票。我当然很感激您花时间尝试解决这里提出的问题。 - johanvdw

0

虽然这是一个老问题,但我面临着同样的问题,而且我很难找到答案。

Visual Studio提供了两种开发Web应用程序的选项:网站和Web应用程序。 Web应用程序为每个页面生成程序集,如果源代码更改,则动态更新。另一方面,Web应用程序项目在Visual Studio中编译为一个程序集。此程序集在源代码更改后不会自动重新构建。这些差异在此文档中详细解释:http://msdn.microsoft.com/en-us/library/aa730880(VS.80).aspx#wapp_topic5

另一个相关的区别是Web应用程序项目允许您选择与Web站点项目相反的架构。将网站转换为Web应用程序并不太困难,但也不太直观(只有在创建... Web应用程序之后才有“转换为Web应用程序”的选项)。您可以采取以下步骤:

  1. 创建一个新的空 Web 应用程序
  2. 浏览到新 Web 应用程序的目录,并将您网站中的所有文件复制到该目录(覆盖目录中的任何内容)
  3. 将所有文件添加到项目中
  4. 右键单击项目,选择“转换为 Web 应用程序”。
  5. 可能需要解决一些命名空间问题。

0

1
嗨Madhur,感谢您的回复。这是一个编译问题,因为使用32位aspnet_compiler编译时可以正常编译,但使用64位版本(在构建服务器上手动构建时)会抛出错误。此外,我不是在构建服务器上尝试运行应用程序,而是在构建它,这意味着我正在编译它。构建的输出在运行IIS的单独Web服务器上运行。 - Col

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接