【问题标题】:stop creating local assemblies when I debug调试时停止创建本地程序集
【发布时间】:2018-01-31 13:11:51
【问题描述】:

我开发了一个 c# 类库,我需要使用外部程序进行调试。

所以我将这个项目的“启动外部程序”设置为我的外部程序,然后我启动调试器。

问题是这个程序集也位于(作为副本)这个外部程序的根目录中。 当我启动调试器时,它会加载两个程序集:一个来自 bin-dir,另一个来自外部程序的 root-dir。

结果是 TargetInvokationException,因为包含的类型位于两个不同的程序集中。

如何防止 Visual Studio 加载这两个程序集?

最好的问候 托比亚斯

【问题讨论】:

  • 嗯...删除程序集文件夹中的那个?

标签: c# .net .net-assembly assembly-resolution


【解决方案1】:

如果您在启动外部进程时遇到问题,您可以转到其他方式并附加到进程。

确保编译 dll 的调试版本并将 .pdb 文件与 dll 一起复制到可执行文件夹中以获得最佳结果

那么你只需要定位到你要调试的应用进程

【讨论】:

  • hm...这可以工作...但它比简单地调试应用程序更复杂 :) 如果我找不到其他解决方案,我将使用您的解决方案
  • 在这种情况下,您的第一道防线是单元测试。针对您的其他应用程序正在使用的常见或关键方法编写测试,这应该最大限度地减少您必须“实时”调试的时间。我通过 COM+ 编写了很多旧应用程序使用的 dll,所以我确实理解其中的痛苦。
【解决方案2】:

我终于做到了:

  1. 我创建了一个构建后事件,我在其中...
    • ...将程序集复制到外部程序
    • ...将程序集复制到每个项目复制其程序集的目录(并且只创建对这些程序集的引用,而不是直接创建对任何项目的引用
    • ...删除调试目录中的程序集

这是我的脚本:

  robocopy "$(TargetDir)\" "..\..\..\..\..\..\USD" "$(TargetFileName)"
  robocopy "$(TargetDir)\" "..\..\..\..\..\..\USD" "$(TargetName).pdb"


  robocopy "$(TargetDir)\" "..\..\..\..\..\..\Lib\myassembly1" "$(TargetFileName)"
  robocopy "$(TargetDir)\" "..\..\..\..\..\..\Lib\myassembly1" "$(TargetName).pdb"

del "$(TargetFileName)"

      REM ignoriert faulty interpretation of 1 Return-Code from robocopy
      set/A errlev="%25ERRORLEVEL%25 & 24"
      exit/B %25errlev%25

如上所述,我将所有直接项目引用更改为 lib 目录中的程序集文件。

现在我可以通过启动外部程序来调试我的项目。不再发生 TargetInvokationException。

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多