【问题标题】:What's the best way to do a bulk namespace rename on a large c# application?在大型 c# 应用程序上进行批量命名空间重命名的最佳方法是什么?
【发布时间】:2011-06-16 02:28:33
【问题描述】:

首先,有一点背景。

目前我们代码库中的命名空间和程序集(约 60 个程序集,数千个类)看起来像

WidgetCompany.Department.Something

我们现在已经分拆出来,因此我们正在销售驱动 WidgetCompany 的软件,所以我们想重命名命名空间和程序集

NewCompany.Something

在正常情况下,我可能会坚持使用旧名称空间,但问题是我们的客户不希望在应用程序的任何地方看到他们的竞争对手之一的名称。如果他们看到堆栈跟踪、程序集属性等,它不应该出现。这并不是要隐藏我们的同事或做任何险恶的事情,我们只需要确保人们知道我们是一个独立的实体,独立的管理,他们不需要担心数据被共享等。

现在是问题。执行这种包罗万象的重命名的最佳方法是什么? 以下内容需要更改:

  • (几乎)每个类的命名空间 应用程序
  • 应用程序中每个引用旧名称的 using 语句
  • 每个项目的文件夹结构
  • 依赖更改文件夹结构的项目之间的引用
  • .Sln 文件引用更改后的文件夹结构
  • 任何参考 那些完全 合格的(应该是少而远 之间)
  • 对这些的任何引用 xml 配置文件中的类(配置 部分等)
  • 每个程序集的 AssemblyInfo.cs 文件
  • 每个 .csproj 文件中的 AssemblyName

我是坚持使用 find-replace-pray 策略还是有更好的方法?

【问题讨论】:

  • 签入、查找-替换、构建。或者 ReSharper,可能。
  • 新的命名空间是在一个新的.dll中还是同一个dll中的命名空间被改变并重新编译了
  • resharper 有 refactor=>change 命名空间吗?我已经有一段时间没有使用它了,但我认为它没有。
  • @Shekhar_Pro:我想这定义了你如何定义一个新的 dll。这将是一个包含不同命名空间类的不同命名的 dll,但我想我会将 .csproj 文件留在原处并重命名。如果有简单的方法,我愿意创建新项目。
  • Resharper 的重构确实包含命名空间重命名选项。 jetbrains.com/resharper/documentation/help20/Refactoring/…

标签: c# .net visual-studio refactoring


【解决方案1】:

右键单击您当前的命名空间并选择 Refactor -> Rename 并在一段时间后出现的弹出窗口中更改名称。输入您的新名称,然后单击确定。

如果您的命名空间有多个深度,那么 Visual Studio 将不允许您键入点。但是,如果您复制并粘贴一个点,尽管有警告,它也会起作用。

要完全更改为新名称,您可能需要手动进行其他更改。您可以通过执行项目搜索 (ctrl+shift+f) 来查找对项目、解决方案或其他支持文件中名称的其他引用,从单独的文本编辑器(如 VS Code)中找到位置。最后,可能还需要手动更改文件夹。

【讨论】:

  • 上次我检查了这不适用于命名空间的多个级别,例如 level1.level2.level3。如果命名空间是单层的,没有点,那么它工作正常。这是 VS 2008 SP1。
  • +1 因为这有助于处理强类型的内容,但对程序集名称、csproj 文件、xml 文件等没有帮助。
  • 如果你想在根目录添加一些额外的命名空间似乎没有帮助
  • 被否决为不正确。不回答最初的问题,因为您不能以这种方式移动或删除命名空间组件。
  • 重新多级更改(带点)。这个错误仍然存​​在(VS 2015),因为它不会让你 type 一个点。但是,如果您复制并粘贴一个点,尽管有警告,它还是会成功。
【解决方案2】:

首先我会尝试Refactor->Rename 选项。但正如评论中提到的另一个答案它并没有那么好(或者我还没有找到如何让它工作)。所以我更喜欢使用下面的场景,特别是如果你想添加一些额外的命名空间。

1) 使用 Refactor-Rename 将根命名空间 (WidgetCompany) 重命名为 NAMESPACE_TO_BE_REPLACED
2) 使用 find-n-replace 对话框将 NAMESPACE_TO_BE_REPLACED 替换为您的最终命名空间 (NewCompany.WidgetSoftware)

并且不要忘记重命名项目、默认命名空间等。

【讨论】:

    【解决方案3】:

    重新锐化。从 JetBrains 免费获取 5.1 版,为期 30 天(有足够的时间进行重命名)。将光标放在要更改的命名空间上,然后按两次 Ctrl-R(ReSharper 重命名)。它将与任意数量级别的命名空间一起使用,并将该命名空间的任何使用转换为新命名空间。但是,您必须更改解决方案中的每个唯一命名空间(除非您只使用查找/替换)

    【讨论】:

      【解决方案4】:
      • 在 [WidgetCompany.Department.Something] 中打开一个随机类
      • 编辑->查找和替换->在文件中替换
      • FindWhat区域输入“WidgetCompany.Department.Something”
      • 替换为区域中键入“NewCompany.Something”
      • 查找范围区域中选择当前项目。
      • 全部替换

      【讨论】:

        【解决方案5】:

        如果您有 ReSharper:

        1. 右键单击项目,属性。将默认命名空间更改为所需 命名空间。

        2. 右键项目,重构 -> 调整命名空间全部更新 使用默认命名空间的命名空间

        那就让它发挥它的魔力吧。

        【讨论】:

          【解决方案6】:

          Visual Studio 2019 社区版支持此功能,如 here 所述。它适用于任何层次结构(带有点、根命名空间更改等)并正确更新所有依赖项。

          1. 将光标置于类名

          2. Ctrl+. 触发快速操作和重构菜单

          3. 选择移动到命名空间

          4. 在打开的对话框中,选择您想要将类型移动到的目标命名空间@

          【讨论】:

            【解决方案7】:

            如果您已经部分重命名了替代解决方案:

            • 打开查找替换(快捷键ctrl + h
            • 确保选择了正则表达式(.* 之类的图标)
            • 粘贴当前命名空间的全名,例如YourSolution.YourProject
            • 粘贴此正则表达式YourSolution.Your[partiallyRenamedNamespaceCharacters].*
            • 确保选择Entire Solution 而不是Current Document
            • 运行

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-09-22
              • 1970-01-01
              • 2013-11-18
              • 1970-01-01
              • 2012-11-21
              • 2014-06-01
              • 1970-01-01
              相关资源
              最近更新 更多