Visual Studio 是 x86 直到至少 2010 版本 更新:这在 VS2010 中仍然是一个问题,没有原生 64 位 Cassini 支持。我的问题是任何人都可以想到一种方法或知道一个独立的 ASP.NET 调试服务器,它是 2008 年或 2010 年的 x64 吗?
背景:我们的 ASP.NET 应用程序针对 Oracle 作为数据库运行。由于稍后我们在 64 位服务器上处理内存问题,因此我们需要使用 Oracle 的 64 位驱动程序(Instant Client)。
设置:
- x64 操作系统(XP 或 Windows 7)
- IIS(6 或 7,均为 x64 应用程序池)
- Oracle 64 位即时客户端(单独的目录,在 PATH 中)
视觉工作室 2008 SP1视觉工作室 2010
在 IIS 中,应用程序池以 64 位运行,按预期使用 Oracle 驱动程序,但是由于WebDev.WebServer.exe是 32 位,因此您将收到BadImageFormatException,因为它试图以 32 位加载 64 位驱动程序 DLL环境。我们所有的开发人员都希望能够通过 Visual Studio 2008 使用快速调试服务器,但由于它以 32 位运行,我们无法做到。我们遇到的一些问题是在应用程序启动期间,所以虽然我们有时会附加到 IIS 进程,但这还不足以追踪问题。
是否有任何替代方案或解决方法?我们希望尽可能地匹配我们的 Dev/Val/Prod 层,所以在 x64 中运行的一切都是理想的。
VS 2010 的更新
自从首次发布以来,对这个问题进行了很多更改,第一个 VS2010 现在已经发布,这里仍然存在相同的问题,但是我所在的项目没有。我们经历了 2 处更改来解决这个问题,所以我将发布这些内容,希望它可以减轻其他人的痛苦:
第一个解决方案是在 32 位以上加载 Oracle x86,在 64 位模式下加载 x64,我们通过 web.config 在 64 位下运行时替换程序集引用来做到这一点,如下所示:
<configuration>
<runtime>
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" processorArchitecture="amd64" />
<bindingRedirect oldVersion="2.0.0.0-10.9.9.9" newVersion="2.102.3.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
这里的关键是processorArchitecture="amd64"
,这意味着只有在 64 位下运行时才会发生替换。
请注意,这些版本现在可能已经过时了(如果您正在阅读这篇特别关注 Oracle 的文章),这已经是前一阵子了。除了配置之外,我们还将 32 位和 64 位版本加载Oracle.DataAccess
到 GAC中。32 位版本适用10.xxx
于 Oracle 10g,64 位版本适用于2.1xxx
,因此只需使用works交换绑定<assemblyBinding>
即可。
第二个更长期的解决方案是完全脱离 Oracle 客户端,我们现在将dotConnect for Oracle用于我们的 Linq-to-SQL 提供程序,并且由于它是使用直接 TCP 连接的完全托管代码,我们没有更多的 32应用程序中的 /64 位特定代码,更易于维护。
我希望任何发现这一点的人也会发现后续工作也很有用。如果您对我最终使用的任一解决方案有疑问,请发表评论,我将尝试更详细地解释。