【问题标题】:VS2010 DLLs not updatingVS2010 DLL 不更新
【发布时间】:2015-04-26 16:14:56
【问题描述】:

我有一个似乎没有正确更新其 dll 的解决方案(ASP.NET、.NET 4.0)。我注意到,当我在进行更改后编译它时,它看不到我所做的添加。

我最近将解决方案上的目标平台切换到 x86,因为我们现在将它部署到 x64 服务器上,而我现在正在 x64 Win7 机器上维护它。 (我不知道这是否与它有关,见下文。)在我隔离问题后,当我测试时,我发现如果我在其中一个 aspx 文件上选择“在浏览器中查看”,它突然看到了我之前所做的更改。我梳理了主项目的 bin 文件夹中的目录,发现 dll 被保存到两个不同的位置:bin 文件夹的根目录和 bin/x86/debug/。第一个位置在我简单编译解决方案时得到更新,第二个位置在我对其中一个 aspx 文件使用“在浏览器中查看”时得到更新。

有谁知道可能导致这种行为的错误设置?

更新:@Vinkal 提供的答案让我相信 Debug 正在查看已编译代码的 bin/ 文件夹,而不是正在编译代码的 bin/x86/debug/。这可能是核心问题吗?

【问题讨论】:

  • 右击你的解决方案,点击Configuration Manager,查看你的项目是否被选中构建。
  • 你有本地程序集吗?任何不是 .NET 的东西?
  • @dotctor,在解决方案的配置管理器中检查解决方案中的所有项目。
  • @beautifulcoder,我确实有两个外部 dll,但在这开始发生之前,我已经将它们与解决方案集成了一段时间。
  • 是否有任何构建后命令集来将文件复制到不同的位置?

标签: c# asp.net .net visual-studio-2010 compiler-errors


【解决方案1】:

我梳理了主项目的 bin 文件夹中的目录,然后 我注意到 dll 被保存到两个不同的地方: bin 文件夹和 bin/x86/debug/.第一个位置是 当我简单地编译解决方案时更新,第二个是 当我在其中一个 aspx 上使用“在浏览器中查看”时得到更新 文件。

检查Configutation Manager 选择platform,如下面的屏幕截图#1 所示。

屏幕截图 #1:配置管理器

如果您创建新的platform(此处为x86),Output Path 将自动设置为bin\x86\Debug\。请参阅下面的屏幕截图。

屏幕截图 #2: 选择项目属性时的构建设置

因此,当您编译项目时,将根据Output Path 复制二进制文件(在我的例子中,bin\x86\Debug\ 用于Platform x86,在Platform Target 中设置)。如下图所示确认,编译时复制所有二进制文件。正如您所提到的,当您编译解决方案时,bin 文件夹的根目录 正在更新。因此,对于您在 Platform Target 中设置的任何 Platform (Any CPU, x86 or x64),您的项目 Output Path 必须设置为 Bin 文件夹的根目录

注意:如果Post-Build event commmand设置为复制Binaries,也会被复制到Post-Build event command中指定的Path

在浏览器中查看:当使用View in browser打开页面时,将再次编译页面并根据Project Properties中指定的Output Path复制二进制文件,如屏幕截图 #2。正如您所提到的,当您在浏览器中查看页面时,bin\x86\Debug\ 会更新,这表明您的Project Properties 中将Output Path 设置为bin\x86\Debug\,在下面显示的屏幕截图中,当使用@987654350 打开页面时@,Binary 去Bin 文件夹,平台选为Any CPU

构建后事件命令:如果您还设置了Post-build event command,如下面的屏幕截图所示,在两种情况下(即当您compile 和View in Browser),它会被复制到Post-build event command指定的Path

编辑:

正如提到的here,使用<probing> 元素:

您可以使用应用程序配置文件中的元素指定运行时在查找assembly 时应搜索的子目录。以下示例显示了如何指定运行时应搜索的目录。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

privatePath 属性包含运行时应搜索assemblies 的目录。如果应用程序位于 C:\Program Files\MyApp,运行时将查找未在 C:\Program Files\MyApp\Bin、C:\Program Files\MyApp\Bin2\ 中指定代码库的 assemblies Subbin 和 C:\Program Files\MyApp\Bin3。 privatePath 中指定的目录必须是应用基目录的子目录

所以在你的情况下,修改web.config,如下所示

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin\x86\debug"/>
      </assemblyBinding>
   </runtime>
</configuration>

【讨论】:

  • 感谢您的展示和图片!他们总是提供帮助。我确实检查了我的解决方案,这一切似乎都如你所见。构建项目会将它们发送到 bin\x86\Debug\,但运行“在浏览器中查看”会将项目编译到 bin\。我确实没有设置任何构建后事件。从行为和您的描述来看,我猜 Debug 正在查看 bin\ 以获取已编译的代码和 pdb 文件。你知道这是为什么,以及如何告诉它查看 x86 文件夹吗?
  • 如果 Debug 正在查看 bin 文件夹,您不能将 Output Path 从 bin\x86\Debug\ 更改为 \bin,以便构建项目将它们发送到 \bin 文件夹而不是 \bin \x86\debug?
【解决方案2】:

您可以尝试通过更改工具 -> 选项-> 调试 -> 符号中的不同配置来解决此问题

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多