将 MVC 项目“任何 CPU”转换为 x64 - 无法加载程序集

Posted

技术标签:

【中文标题】将 MVC 项目“任何 CPU”转换为 x64 - 无法加载程序集【英文标题】:Converted MVC project 'Any CPU' to x64 - fails to load assemblies 【发布时间】:2014-05-03 13:38:58 【问题描述】:

在将 MVC/EntityFramework 解决方案 (VS2012) 和实用程序解决方案从“任何 CPU”转换为“x64”后,我遇到了问题。我需要这样做,因为部署机器上只有 Oracle x64 驱动程序,并且由于某种原因这些驱动程序不会加载“任何 CPU”。

错误是:'无效的程序集平台或 ContentType'。

好的。 32/64 位不匹配某处。

我重新验证了所有项目都设置了“x64”。控制台应用程序项目(在实用程序解决方案中)都运行良好,并在任务管理器中显示为完全 64 位。这些控制台应用程序现在可以与 Oracle 64 位驱动程序对话,但它们没有在“任何 CPU”下。一切看起来都不错。

但是,当我现在使用 Visual Studio 开发服务器运行 MVC 项目时,它从实用程序解决方案获取的程序集 (utility1.dll) 现在因“程序集平台或 ContentType 无效”而失败。该程序集也被所有控制台应用程序成功使用。我使用 Fusion Log Viewer (fuslogvw.exe) 验证了错误:

LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Users\user1\Documents\Visual Studio 2012\Projects\mvcWebSite\web.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/4446faac/e5108f09/utility1.DLL.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/4446faac/e5108f09/utility1/utility1.DLL.
LOG: Attempting download of new URL file:///C:/Users/user1/Documents/Visual Studio 2012/Projects/mvcWebSite/bin/utility1.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Users\user1\Documents\Visual Studio 2012\Projects\mvcWebSite\bin\utility1.dll
LOG: Entering download cache setup phase.
LOG: Assembly Name is: utility1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
ERR: Invalid assembly platform or ContentType in file (hr = 0x8007000b).
ERR: Setup failed with hr = 0x8007000b.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.

为什么它使用'C:\Windows\Microsoft.NET\Framework'而不是'C:\Windows\Microsoft.NET\Framework64'?部分问题?

所以我在 mvcWebSite bin 目录中运行了一个 arch 设置阅读器实用程序(其中应该包含网站的所有 DLL,这就是我所看到的):

这台机器是 64 位的

AntiXssLibrary.dll                       - I386            - ILOnly
Antlr3.Runtime.dll                       - I386            - ILOnly
utility1.dll                             - AMD64           - ILOnly, PE32Plus
utility2.dll                             - AMD64           - ILOnly, PE32Plus
EntityFramework.dll                      - I386            - ILOnly
htmlSanitizationLibrary.dll              - I386            - ILOnly
log4net.dll                              - I386            - ILOnly
Microsoft.Practices.Unity.Configuration.dll - I386            - ILOnly
Microsoft.Practices.Unity.dll            - I386            - ILOnly
Microsoft.ReportViewer.Common.dll        - I386            - ILOnly
Microsoft.ReportViewer.WebForms.dll      - I386            - ILOnly
MvcReportViewer.dll                      - I386            - ILOnly
Newtonsoft.Json.dll                      - I386            - ILOnly
Oracle.DataAccess.dll                    - AMD64           - ILOnly, PE32Plus
RestSharp.dll                            - I386            - ILOnly
System.Web.Helpers.dll                   - I386            - ILOnly
System.Web.Http.dll                      - I386            - ILOnly
System.Web.Http.WebHost.dll              - I386            - ILOnly
System.Web.Mvc.dll                       - I386            - ILOnly
System.Web.Optimization.dll              - I386            - ILOnly
System.Web.Razor.dll                     - I386            - ILOnly
System.Web.WebPages.Deployment.dll       - I386            - ILOnly
System.Web.WebPages.dll                  - I386            - ILOnly
System.Web.WebPages.Razor.dll            - I386            - ILOnly
Unity.Mvc4.dll                           - I386            - ILOnly
mvcWebsite.dll                           - AMD64           - ILOnly, PE32Plus

这看起来好吗?我不知道为什么utility1不会加载。恐怕这里仍然存在“任何 CPU”设置的剩余部分。

感谢您的建议!

【问题讨论】:

你解决了这个问题吗?我对 asp.net web api 也有同样的情况。在我的本地机器上,我有 VS 2013 的 32 位 oracle 访问组件,一切正常。但是当我部署到只安装了64位oracle访问组件的服务器时,出现了错误。 【参考方案1】:

我的问题是 Visual Studio 内部 Web 服务器不喜欢 64 位应用程序 - 因此它不喜欢 64 位程序集。我切换到部署到本地 IIS 服务器(在项目 Web 设置中)。

我知道,如果您要部署到远程 IIS,则需要注意 Web 应用程序分配的应用程序池中的“允许 32 位应用程序”设置。

希望这会有所帮助。

【讨论】:

【参考方案2】:

我在使用“任何 CPU”时遇到了与第三方库 AMD64 类似的问题。

在 web.config 的 system.web 部分:

<compilation debug="true" targetFramework="4.5" >      
   <assemblies>
     <remove assembly="The.Offending.Library.Name"/>
   </assemblies>
</compilation>

我的麻烦一直是间歇性的,我不确定这是否真的解决了问题,但似乎已经解决了。希望能帮助到你。

【讨论】:

【参考方案3】:

我们也可以在下面切换IIS Express到64位版本 选项 -> 项目和解决方案 -> Web 项目

【讨论】:

以上是关于将 MVC 项目“任何 CPU”转换为 x64 - 无法加载程序集的主要内容,如果未能解决你的问题,请参考以下文章

使用 __m64 引用将 C++ 项目转换为 x64

使用 __m64 引用将 C++ 项目转换为 x64

将 x86 转换为 x64 发生链接错误(2019)

MSBuild:避免重复构建任何 CPU 项目引用

在“任何 CPU”.NET 程序集上强制 x86 CLR

在多个平台的解决方案中构建 Visual Studio C++ 项目