"Type 'MyProject.MyUC' is not defined" 错误开始出现并且不会消失
"Type 'MyProject.MyUC' is not defined" error started appearing and won't go away
我遇到了一个让我抓狂的问题。当我尝试在 Visual Studio 中构建 VB.NET + WPF 项目时,出现错误 “类型 'MyProject.MyUC' 未定义”。在我对该解决方案中的其他文件进行一些更改后出现此错误(与该 UC 完全无关,它是后端代码,或者使用该 UC 的 window。完全独立的代码)。我正在使用 GIT,我正在比较旧分支和新分支,所以我知道这是事实。
使用控件的window是这样定义的:
<Window x:Class="MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:uc="clr-namespace:MyProject"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
mc:Ignorable="d"
Title="MyWindow" Height="350" Width="650">
<Grid>
<uc:MyUC x:Name="MyUC"></uc:MyUC>
</Grid>
</Window>
UC是这样定义的:
<UserControl x:Class="MyUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FLOATSOFT"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="600">
<Grid>
</Grid>
</UserControl>
支持 VB 代码:
Public Class MyUC
End Class
(没有特定的命名空间声明)
我删除了所有功能代码以显示结构。但即使我实际上 trim 将我的代码写成我引用的内容,它也不会编译。
我不明白。 MyUC
肯定在 MyProject
命名空间中。如果我将鼠标悬停在 VB 代码中的 class 名称上,工具提示会显示:“Class MyProject.MyUC”,确认它绝对位于正确的命名空间中。
为什么会这样?我仍然在另一个 GIT 分支中引用了所有这些,即使所有这些文件都 100% 匹配,另一个分支编译,而这个给出了这个可怕的“类型 'MyProject.MyUC' 未定义”错误。
我试过:
正在重新启动 Visual Studio - 这曾经有助于解决此类错误;
清理和重建;
重新创建所有这些文件(MyWindow.XAML、MyWindow.XAML.VB、MyUC.XAML 和 MyUC.XAML.VB) 并将代码复制到这些新文件;
如果我注释掉这个 UC 的用法并且没有其他编译错误,请确保我的代码可以构建。
在MyUC.XAML中明确说明命名空间:
<用户控件x:Class="MyProject.MyUC"
并在 MyUC.XAML.VB:
Namespace MyProject
Public Class MyUC
End Class
End Namespace
也无济于事。同样的错误。
- 正在创建一个新项目并复制这 4 个文件。它编译。但是每次发生这种情况都必须重新创建项目是很荒谬的。就像我说的,它经常发生,但重新启动 Visual Studio 曾经有帮助。这次不行。
我完全不知所措。我已经查看了数十篇与此类似的帖子,但还没有找到答案。一个答案表明这可能是由于项目和引用程序集的 .NET 版本不同,但我没有。
一个分支编译,另一个分支抛出这个错误。两者在可能与此 UC 相关的每个文件中都有相同的代码。我如何找到原因?
编辑:我忘了说我也试过在这个项目分支中从头开始创建一个新的 UC,如果我尝试像 MyUC 这样使用它,这个项目分支将无法编译。但是另一个分支仍然可以编译。
编辑:非常重要:我刚刚发现如果我改变
<Grid>
<uc:MyUC x:Name="MyUC"></uc:MyUC>
</Grid>
到
<Grid>
<uc:MyUC></uc:MyUC>
</Grid>
(省略 x:Name="MyUC"),然后代码突然编译,我没有得到任何错误。如果我为这个 UC 设置一个名称——任何名称——它都不会编译。我完全不知道发生了什么。
我终于明白了。事实证明,这个问题与 this one 相同。简而言之,我是对的——这 4 个文件没有任何变化,它们应该已经编译。但是,在一个完全独立的文件中,我错误地为其中一个模块定义了名称空间。我应该写:
Namespace MyModule
Public Module MyModule
End Class
End Namespace
但相反,我写道:
Namespace MyProject.MyModule
Public Module MyModule
End Class
End Namespace
虽然这个 MyModule
与 MyUC
或 MyWindow
完全无关,但显然它创建了一个命名空间 MyProject.MyProject
,这就是 MyWindow 无法编译的原因,大概是因为它试图在 MyProject.MyProject
中搜索 MyUC
。这很奇怪,因为我得到的错误并没有暗示这一点。事实上,任何地方都没有暗示我有这种命名空间。就像我在问题中写的那样,在我调试的所有地方,我发现 MyUC
直接在 MyProject.MyUC
中声明。并且所有其他 window 都有相同的声明,但他们编译了。
我必须承认 VS 编译器抛出的错误非常不直观,它提供的关于命名空间的信息对于那个 UC 来说是完全错误的,我只是偶然发现了解决方案。甚至对象查看器也显示名称空间没有问题(它没有显示我有 MyProject.MyProject
)。
希望这对遇到同样问题的人有所帮助。我也很想听听有关如何使这些编译器错误更直接地解决实际问题的任何建议,因为在这种情况下,它完全是错误的。
我遇到了一个让我抓狂的问题。当我尝试在 Visual Studio 中构建 VB.NET + WPF 项目时,出现错误 “类型 'MyProject.MyUC' 未定义”。在我对该解决方案中的其他文件进行一些更改后出现此错误(与该 UC 完全无关,它是后端代码,或者使用该 UC 的 window。完全独立的代码)。我正在使用 GIT,我正在比较旧分支和新分支,所以我知道这是事实。
使用控件的window是这样定义的:
<Window x:Class="MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:uc="clr-namespace:MyProject"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
mc:Ignorable="d"
Title="MyWindow" Height="350" Width="650">
<Grid>
<uc:MyUC x:Name="MyUC"></uc:MyUC>
</Grid>
</Window>
UC是这样定义的:
<UserControl x:Class="MyUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FLOATSOFT"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="600">
<Grid>
</Grid>
</UserControl>
支持 VB 代码:
Public Class MyUC
End Class
(没有特定的命名空间声明)
我删除了所有功能代码以显示结构。但即使我实际上 trim 将我的代码写成我引用的内容,它也不会编译。
我不明白。 MyUC
肯定在 MyProject
命名空间中。如果我将鼠标悬停在 VB 代码中的 class 名称上,工具提示会显示:“Class MyProject.MyUC”,确认它绝对位于正确的命名空间中。
为什么会这样?我仍然在另一个 GIT 分支中引用了所有这些,即使所有这些文件都 100% 匹配,另一个分支编译,而这个给出了这个可怕的“类型 'MyProject.MyUC' 未定义”错误。
我试过:
正在重新启动 Visual Studio - 这曾经有助于解决此类错误;
清理和重建;
重新创建所有这些文件(MyWindow.XAML、MyWindow.XAML.VB、MyUC.XAML 和 MyUC.XAML.VB) 并将代码复制到这些新文件;
如果我注释掉这个 UC 的用法并且没有其他编译错误,请确保我的代码可以构建。
在MyUC.XAML中明确说明命名空间:
<用户控件x:Class="MyProject.MyUC"
并在 MyUC.XAML.VB:
Namespace MyProject
Public Class MyUC
End Class
End Namespace
也无济于事。同样的错误。
- 正在创建一个新项目并复制这 4 个文件。它编译。但是每次发生这种情况都必须重新创建项目是很荒谬的。就像我说的,它经常发生,但重新启动 Visual Studio 曾经有帮助。这次不行。
我完全不知所措。我已经查看了数十篇与此类似的帖子,但还没有找到答案。一个答案表明这可能是由于项目和引用程序集的 .NET 版本不同,但我没有。
一个分支编译,另一个分支抛出这个错误。两者在可能与此 UC 相关的每个文件中都有相同的代码。我如何找到原因?
编辑:我忘了说我也试过在这个项目分支中从头开始创建一个新的 UC,如果我尝试像 MyUC 这样使用它,这个项目分支将无法编译。但是另一个分支仍然可以编译。
编辑:非常重要:我刚刚发现如果我改变
<Grid>
<uc:MyUC x:Name="MyUC"></uc:MyUC>
</Grid>
到
<Grid>
<uc:MyUC></uc:MyUC>
</Grid>
(省略 x:Name="MyUC"),然后代码突然编译,我没有得到任何错误。如果我为这个 UC 设置一个名称——任何名称——它都不会编译。我完全不知道发生了什么。
我终于明白了。事实证明,这个问题与 this one 相同。简而言之,我是对的——这 4 个文件没有任何变化,它们应该已经编译。但是,在一个完全独立的文件中,我错误地为其中一个模块定义了名称空间。我应该写:
Namespace MyModule
Public Module MyModule
End Class
End Namespace
但相反,我写道:
Namespace MyProject.MyModule
Public Module MyModule
End Class
End Namespace
虽然这个 MyModule
与 MyUC
或 MyWindow
完全无关,但显然它创建了一个命名空间 MyProject.MyProject
,这就是 MyWindow 无法编译的原因,大概是因为它试图在 MyProject.MyProject
中搜索 MyUC
。这很奇怪,因为我得到的错误并没有暗示这一点。事实上,任何地方都没有暗示我有这种命名空间。就像我在问题中写的那样,在我调试的所有地方,我发现 MyUC
直接在 MyProject.MyUC
中声明。并且所有其他 window 都有相同的声明,但他们编译了。
我必须承认 VS 编译器抛出的错误非常不直观,它提供的关于命名空间的信息对于那个 UC 来说是完全错误的,我只是偶然发现了解决方案。甚至对象查看器也显示名称空间没有问题(它没有显示我有 MyProject.MyProject
)。
希望这对遇到同样问题的人有所帮助。我也很想听听有关如何使这些编译器错误更直接地解决实际问题的任何建议,因为在这种情况下,它完全是错误的。