【问题标题】:ASP.net Pages With 64 Bit Assembly in Visual Studio 2010Visual Studio 2010 中带有 64 位程序集的 ASP.net 页面
【发布时间】:2011-05-04 18:52:54
【问题描述】:

短版

我在 VS 2010 的 Asp.net MVC 应用程序中使用 64 位 dll (system.data.sqlite)。应用程序运行和调试正常,但在 Visual Studio 2010 中编辑时所有 aspx 和 ascx 页面都显示错误并且智能感知不起作用。

这是VS2010 regression bug。有人有解决办法吗?

(或)

有谁知道一个不会导致 32/64 位问题的免费、可靠、可用于生产的嵌入式数据库?

更多详情

显然这在 Visual Studio 2008 和 this has been is a known regression bug in Visual Studio 2010 for several months 中有效。我不想恢复到 VS 2008,也不想在 32 位模式下调试。

我有需要调试和部署为 64 位模式的 Web 应用程序,因为它使用一些非托管的 64 位 dll,例如 system.data.sqlite。另外,我更喜欢在 64 位模式下进行调试,因为它允许我们测试一些高内存用例。

经过一番折腾,Asp.net 将部署并运行良好。然而,所有的 aspx 和 ascx 页面都显示错误,并且在 Visual Studio 2010 中编辑它们时智能感知不起作用。显然这在 Visual Studio 2008 和 this has been is a known problem in Visual Studio 2010 for months 中有效。我不想恢复到 VS 2008。

有一个关于posted on SO here 的工作,但它在我的测试中不起作用,将调试限制为 32 位模式,而且感觉有点 hacky(我认为它只适用于 VS Express 风格的网站)。有没有人在 Web 应用程序中完成这项工作或有更好的解决方法?

对于那些感兴趣的人来说,Visual Studio 2010 在 64 位 dll 上还有另外两个问题,我已经设法解决了。

问题 1 - Cassini: Cassini 只能在 32 位模式下调试

解决方案 1 - CassiniDev 或 Localhost: 使用 localhost 调试或在 64 位模式下编译 CassiniDev (an opensoure variant of cassini)。我喜欢使用 cassini 调试新 Web 应用程序的零配置简单性,因此我使用了 CassiniDev。您只需将 dll 粘贴在 C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0 中,它就可以工作了(我建议您备份 Cassini 版本,您将在编写时过度使用)。

问题 2 - MSTest:默认情况下,单元测试使用 MSTest fail to load 64bit dlls 运行。

解决方案 2 - AnyCPU 和 64 位主机进程 Instructions here,将 local.testsettings 设置为 AnyCPU 和 64 位主机进程

我开始认为整个设置太简单了,我正处于放弃和重组我的应用程序以不使用 64 位 dll 的边缘。我也对 Visual Studio 2010 导致所有这些问题感到非常失望。有人可以让 MS 修复他们创建的回归错误吗?

或者,

我们想使用嵌入式数据库。有谁知道不会导致 32/64 位问题的免费、可靠、生产就绪的可嵌入数据库?

【问题讨论】:

  • 我也看过这个解决方案,但我不确定它是否适合我的用例。 scottbilas.com/blog/… 如果有人愿意重新编译 sqlite 以使用代理 dll 的东西,我很想听听它是怎么回事。
  • 我倾向于 ManagedEsent managedesent.codeplex.com 我认为依赖具有 Microsoft.Isam.Esent.Interop 所需 dll 的 Windows 服务器是安全的,它比数据库更像是一个键值存储,但我认为它可能符合我的目的,把这些琐碎的事情抛在脑后。

标签: asp.net visual-studio-2010 dll 64-bit 32bit-64bit


【解决方案1】:

我在网站项目的 bin 目录中有一个 x64 dll。该网站将在 IIS 64 位应用程序池中运行,但无法在 Cassini 中运行。每次我打开一个页面时,Visual Studio 也会抛出错误(格式不正确),这让 IDE 非常缓慢。

网站项目(与 Web 应用程序项目不同)是动态编译的。但是 Visual Studio 将只使用 32 位 aspnet_compiler。当使用页面检查器或使用“编译网站”菜单项时,这是正确的。我找不到改变这种行为的方法。 x64 位上的 IIS 将使用 x64 版本的 aspnet_compiler 进行动态编译,一切正常。

让 Visual Studio 停止抛出错误的唯一可行解决方案是从 bin 目录中删除 x64 dll 并在运行时动态加载它,如 here 所述。

这可以通过在 web.config 文件中使用 assemblyBindingprobing 来完成。 privatePath 必须是应用程序目录的子目录,而不是应用程序目录之外。

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="dlllocation" />
    </assemblyBinding>
  </runtime>
<configuration>

您还需要在 @Page 指令之前向任何 aspx 文件添加代码

<%@ Assembly Name="fileNameWithoutExtension" %>
<%@ Import Namespace="NameSpace" %>

【讨论】:

    【解决方案2】:

    恐怕没有一种解决方法可以使用 64 位非托管 dll 依赖项启用 64 位调试 Asp.net,而不会破坏 Web 表单编辑器。我认为 VS Asp.net 团队认为 64 位依赖项是一种极端情况,并会在他们有时间时修复 webforms 编辑器......请注意。

    您始终可以在 32 位模式下进行调试,然后在没有经过适当测试的情况下部署 64 位。

    我计划通过使用基于托管 esent 的持久键/值解决方案替换 sqlite 来避免此问题。

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多