“ Forms” 在命名空间 system.windows 中不存在。

88

我刚开始学习C#,在论坛上找到了一些代码示例并尝试着修改。

这段代码使用了命名空间using system.windows.forms,我却得到了以下错误信息:

“Forms does not exist in the namespace system.windows.”(system.windows 命名空间中不存在 Forms)

同时,我还遇到了一些与senddownsendup未定义相关的错误,我相信这些函数应该是在Forms命名空间中。

我在使用 Visual Studio 10(带有 .net Framework 4.0),你知道如何解决这个错误吗?


18
在代码中加入对 System.Windows.Forms 的引用。 - ta.speot.is
3
似乎你创建了一个 WPF 项目而不是 Windows Forms 项目。 - shf301
3
@todda,谢谢,那个方法有效 :) @shf301,是的,这是一个WPF项目,但增加了提到的引用后就可以了。 - John Smith
2
请注意,以后在向 Stack Overflow 提问时,请粘贴“确切”的代码,这些代码在其他方面非常区分大小写... - user166390
2
@sara 关于你的悬赏,你在这里寻找什么样的答案?你需要哪些“官方来源”?问题已经得到明确回答:你不能使用未添加引用的命名空间中的项目。你是否正在寻找与语言标准相同观点的引文? - Cody Gray
显示剩余2条评论
8个回答

148

在“解决方案资源管理器”中展开项目,在 引用右键单击,选择 添加引用,在框架选项卡中选择 System.Windows.Forms

有时需要添加对某些非默认程序集的引用。

对于寻找 VS 2019+ 的操作:现在在“解决方案资源管理器”中的 依赖项右键单击以添加项目引用。

对于寻找 VS Code 的操作:如何在 Visual Studio Code 中添加程序集引用


2
好的,这个方法有效。我以为我已经添加了它。刚刚再次检查,果然是缺少了。谢谢 :) - John Smith
2
在项目下的“引用”节点上右键单击。 - naXa stands with Ukraine
2
针对寻找VS 2019的人的更新 - 现在添加项目引用是在解决方案资源管理器中右键单击“依赖项”。 - Dushyant Deshwal
@VMAtm 我已经看过这篇帖子了,但它并没有起作用。我已经从VS Code切换到Visual Studio,但仍然遇到问题。无论如何,还是谢谢你的尝试。 - Boneco Sinforoso
1
@VMAtm 很抱歉给您带来不便。我在使用vscode和unity时,将unity按钮引用为Windows应用程序按钮,因此出现了错误。 - Boneco Sinforoso
显示剩余5条评论

81

假如有人在尝试在 .NET Core 3+ WPF 应用程序中引用 Windows Forms 组件时遇到了此错误(实际上这种情况并不少见),解决方法是进入 .csproj 文件(在 VS2019 中双击它),然后将其添加到包含目标框架的属性组节点中。像这样:

<PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWPF>true</UseWPF>
    <UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>

7
这正是对我起作用的解决方案。我看到的很多提议的解决方案都建议添加对“System.Window.Forms”的引用,但那个提议从未对我起过作用。我能够添加该引用并解决我的缺少Forms类问题,但通过添加该引用,却破坏了“System.Window”。 - Tom Rutchik
奇怪的是,在一台计算机上它能够工作,但在另一台计算机上打开后失败了。解决方案是使用UseWindowsForms标记。考虑到.NET Core中Windows Forms的问题,Visual Studio应该在错误查找和允许你添加表格而无需关闭、手动编辑和重新加载时提供更有用的东西... - Neil
感谢。同时,我需要将目标框架从net5.0更改为net5.0-windows。 - mfvjunior
@mfvjunior,是的,在这里完整地解释了:https://dev59.com/ymw15IYBdhLWcg3wZq1r#66098428 - dani herrera
使用此答案将旧的MS C#示例代码(针对4.0版本)与Net 7.0一起使用。唯一需要解决的另一个问题是通过完全限定System.Windows.Forms.Application来消除“Application”的歧义性。https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/aa480727(v=msdn.10)?redirectedfrom=MSDN - DS_London

20
如果您在使用.Net Core应用程序编写Windows Forms代码,则很可能会遇到此错误: CS0234错误“System.Windows”命名空间中不存在“Forms”类型或命名空间名称(您是否缺少程序集引用?) 如果您正在使用Sdk样式的项目文件(建议使用),则*.csproj文件应类似于此:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <OutputType>WinExe</OutputType>
    <UseWindowsForms>true</UseWindowsForms>
    <RootNamespace>MyAppNamespace</RootNamespace>
    <AssemblyName>MyAppName</AssemblyName>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="3.0.0" />
  </ItemGroup>
</Project>

请特别关注这些行:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<OutputType>WinExe</OutputType>
<UseWindowsForms>true</UseWindowsForms>
<PackageReference Include="Microsoft.Windows.Compatibility" Version="3.0.0" />

请注意,如果您在使用WPF时引用了一些WinForms库,您还应该添加 <UseWPF>true</UseWPF>

提示:自.NET 5.0起,微软建议使用SDK Microsoft.Net.Sdk来代替Microsoft.Net.Sdk.WindowsDesktop


14

网速≥5

<TargetFramework>
   net5.0-windows
</TargetFramework>

引用自.NET 5.0的发布:

Windows桌面应用程序接口(包括Windows Forms、WPF和WinRT)仅在目标为net5.0-windows时可用。您可以指定操作系统版本,例如net5.0-windows7或net5.0-windows10.0.17763.0(适用于Windows 2018年10月更新)。如果想要使用WinRT接口,则需要针对Windows 10版本进行目标设置。

在您的项目中:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

</Project>

另外有趣的是:

  • net5.0是.NET 5.0的新目标框架代号(TFM)。
  • net5.0组合并替换了netcoreapp和netstandard TFM。
  • net5.0支持.NET Framework兼容模式。
  • net5.0-windows将用于公开Windows特定功能,包括Windows Forms、WPF和WinRT API。
  • .NET 6.0将使用相同的方法,采用net6.0,并增加net6.0-ios和net6.0-android。
  • 特定于操作系统的TFMs可以包括操作系统版本号,例如net6.0-ios14。
  • 可移植API,如ASP.NET Core将可在net5.0中使用。Xamarin表单将在net6.0中使用同样的方法。

2
如果您的解决方案中有多个项目,并且其中一个项目位于解决方案文件夹内,那么您可能会遇到这个问题。我通过在解决方案树中右键单击此文件夹,然后按“从项目中排除”来解决这个问题。 exclude folder

0

对于只需要 Windowsform 命名空间中的结构和一些函数的人,您只需要将项目更改为旧行为。

将 DisableWinExeOutputInference 设置为 true,然后 OutputType 就不会被 Visual Studio 覆盖 :D。

不要忘记将 -windows 添加到 TargetFramework。

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<DisableWinExeOutputInference>true</DisableWinExeOutputInference>
<UseWindowsForms>true</UseWindowsForms>
<StartupObject></StartupObject>
<ApplicationIcon />
</PropertyGroup>

我在这里找到了它们 https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/5.0/sdk-and-target-framework-change


-1
browxy.com 
Compilation failed: 1 error(s), 0 warnings
main.cs(7,24): error CS0234: The type or namespace name `Forms' does not exist in the namespace `System.Windows'. Are you missing `System.Windows.Forms' assembly reference?

browxy.com


2
这不是一个答案。 - Adam Calvet Bohl

-1

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Jean Jimenez
我忘记了导致这篇帖子的背景细节,但据我记得,我陷入了一个无法在我的项目中引用表单的情况(旧的.Net4.8框架,所以这个解决方案可能不适用于其他框架-发帖人正在使用4.0),而提到的NuGet包解决了这个问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接