【问题标题】:Migrate old VB.NET project from VS2013 to VS2017将旧的 VB.NET 项目从 VS2013 迁移到 VS2017
【发布时间】:2019-12-08 23:17:45
【问题描述】:

我有一个巨大的企业 asp.net 应用程序,可以完美地在服务器上构建和运行。我们一直在工作流程中使用 Visual Studio 2013。现在我们要迁移到更新的 IDE。但如果我在 Visual Studio 2017 中构建此应用程序,我会收到此错误。

错误 BC40004 sub 'PreInit' 与基类 'Page' 中的事件 'PreInit' 冲突,应声明为 'Shadows'。

我认为这是VB编译器版本的问题(再次vs2013构建项目)。你知道如何解决这个问题吗?

我的解决方案包含 40 多个项目。主要项目是用 VB.net 编写的 asp.net webforms 应用程序。其他项目是用 C# 编写的服务和代码库。

我尝试在 .vdproj 中手动指定 VB.net 版本。但这并没有解决我的问题。

编辑:很好。谢谢大家的回复。我得到的问题是关于代码的,而 Visual Studio 分析器在过去几年中发生了很大变化。我会试着找出这段代码无异常运行的原因。

【问题讨论】:

  • 如果省略Shadows 关键字,则该成员将被视为无论如何都存在,因此编译的应用程序的运行方式没有区别。始终在派生类中声明一个与基类中的成员同名的成员是一个好习惯,OverridesShadows 这样任何阅读代码的人都清楚,这不是一个错误成员有相同的名字。
  • 也就是说,在一个类中拥有一个名为 PreInitSub 可能不是很好,该类继承了另一个具有名为 PreInit 的事件的类。您通常只会隐藏同类型的成员,例如一个Sub 覆盖一个Sub 或一个Property 覆盖一个Property。跟踪事件甚至没有多大意义。
  • 当您有冲突时,包括完整的命名空间将解决冲突。就像使用 System.Net.TcpClient 而不是只使用 TcpClient。
  • 我认为这无关紧要的原因是,当你隐藏一个成员时,它是通过基类型的引用调用的基成员,而派生成员是通过派生类型的引用调用。当PreInit 事件被引发时,它可能是通过Page 类型的引用,因此只有该事件可见,因此您的PreInit 方法在该上下文中无效。

标签: asp.net vb.net visual-studio webforms


【解决方案1】:

BC40004 是一个警告,这不应该阻止您编译解决方案,除非您在选项卡编译下的项目属性上设置Treat warnings as errors

【讨论】:

  • 好的。现在我的项目构建成功。但是 vs2013 编译带有这个标志或没有它的项目。与 vs2013 相比,MS 在 vs2017 中改变了他们的政治吗?
  • 这些年来他们可能刚刚收紧了代码分析规则。
  • 我不知道,但是vs2017使用了较新版本的MSBUILD,因此可能对某种警告进行不同的处理
  • @DenVys 他们完全重写了编译器。 VS 2013 是最后一个使用 C++ 编写的原始编译器的 VS 版本,从 VS 2015 开始,他们切换到用 VB 编写的新“Roslyn”编译器。
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多