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

时间:2014-03-25 15:31:35

标签: .net asp.net-mvc-4 visual-studio-2012 32bit-64bit

在转换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”还有一个遗留问题。此处仍然有效的设置。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

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

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

Hopwe这有帮助。

答案 1 :(得分:0)

当我使用'Any CPU'时,我遇到了与AMD64的第三方库类似的问题。

在web.config的system.web部分中:

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

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