类型“System.IDisposable”是在未被引用的程序集中定义的。

32
我在Windows 8上使用Visual Studio 2012创建了一个Windows表单应用程序,目标.NET Framework是4.5。我想要使用Windows SDK的Datagramsocket库,所以我将目标操作系统版本更改为8,当我编译时,出现以下错误:
“错误1:类型'System.IDisposable'在未引用的程序集中定义。您必须添加对程序集'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'的引用。”

如果我是你,我会考虑编写一个dll来封装4.0组件,并从你的4.5代码中使用它,以便保持哪个系统是哪个系统都整洁明了。建议使用Wince操作系统。 - Tony Hopkinson
3
4.5 是一次就地升级,因此您始终会使用 4.5 的 System - David Pfeffer
@David,这个数据报传输协议可能让你有些困惑,但我很愿意帮忙。 :) - Tony Hopkinson
9个回答

32
如果你的目标是Windows 8,那么根据MSDN文档的说明:你的桌面应用程序在没有准备好必要的参考之前,不能从Windows Runtime消费任何东西。Windows Runtime在System.Runtime中定义了一些标准类和接口,如IEnumerable等,这些在Windows Runtime库中被广泛使用。默认情况下,你的托管桌面应用程序无法找到这些类型,因此你必须在可以使用Windows Runtime类之前手动引用System.Runtime。按照以下步骤创建这个手动引用:
  1. 在解决方案资源管理器中导航到您的托管桌面应用程序项目。
  2. 右键单击“引用”节点,然后单击“添加引用”。
  3. 单击“浏览”选项卡。
  4. 单击“浏览…”。
  5. 导航到System.Runtime.dll外观。通常可以在类似于下面的路径中找到它:%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Runtime.dll
希望能对你有所帮助。

这是很棒的分析。要下载缺失的dll文件,请查看答案https://dev59.com/1WUq5IYBdhLWcg3waPtC#14517992的链接。 - user3918598
谢谢Nathan。我将文件复制到我的Web项目bin文件夹中,以便它可以与解决方案一起打包。添加引用>解决方案>项目的Bin文件夹。 - JoshYates1980

19

3
这个方法有效。在 Windows 10 上,我需要安装更新的 .NET Framework 4.5.2 Developer Pack。 - sakura-bloom
谢谢Josh,但是我正在运行VS2015企业版更新2,仍然遇到这个问题。项目的目标是4.5.2。如果我在web.config中手动添加引用,它可以工作。由于我正在进行一个团队项目,其他人没有遇到这个问题,所以我不想将其作为修复措施添加。有其他人找到了解决方法或指导我方向吗? - Jonathan Stanton
在我们的 Windows Server 2012 构建机上安装 .NET Framework 4.5.2 开发人员包修复了该问题。 - Jamby

2

我刚遇到了Windows 10、TeamCity和VS2015的问题:

症状:

Visual Studio可以成功构建项目,但TeamCity在编译时出现了问题。

原因:

向现有解决方案添加了一个新项目-忘记更改TargetRuntimeVersion。

解决方案:

卸载项目

编辑该项目的.csproj文件

更改:

<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>

无论您有哪些其他项目,或服务器上安装了什么内容。
对我而言,它是:
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

希望这篇文章能帮助到其他遇到同样问题的人。

1
在使用 TFS 构建代理时,我一直看到下面的错误,但只有安装了 4.5.2 的 Windows 2012 R2 服务器才会出现此错误。我们的 Visual Studio 机器都没有编译错误。
“错误1:类型 'System.IDisposable' 是在一个未被引用的程序集中定义的。您必须添加对程序集'System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用。”
如其他人所指出的,原因与可移植类库有关。至于解决方案,一些人建议在 %ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Runtime.dll 中引用 System.Runtime.dll 外观,但我不同意,因为路径和版本在其他计算机上可能会有所不同。
相反,我发现最好的解决方案是在构建机器上安装 Windows SDK
我从这篇文章这里找到了解决方案,以及一个非常清晰的描述为什么会出现这个问题这里

1

基于TFS 2015构建服务器

我不知道这个错误消息是否通用,答案/解决方案可能对每个独特的错误都是独特的。但是我遇到了类似的错误the type 'System.IDisposable' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

我意识到该项目正在使用Microsoft.Practices.Unity并且有接口IUnityContainer实现了IDisposable。结果发现TFS Build Definition NuGet Installer Build Step未配置,该步骤负责在TFS Build Server上恢复Microsoft.Practices.Unity NuGet包。如果您遇到此错误,请检查您的TFS Build Definition并将NuGet Installer Build Step Path指向您的解决方案完整路径,包括.sln扩展名。

enter image description here


1
在将Unity 4.0.1添加到以.NET Framework 4.6.1为目标的项目后,我在TeamCity中遇到了此错误消息。最终,我从我的开发计算机复制了C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework中缺失的文件夹到构建服务器中。两者都运行Windows 7。之后构建成功。

enter image description here


那可能不是最好的解决方法...(复制文件) - Gavin Stevens

1

看起来你的应用程序正在尝试加载4.0版本的System.Runtime,但你没有安装该版本。你说你已经安装了.NET 4.5,所以你可以在运行时提供一些配置来重定向程序集绑定

尝试将以下内容添加到你的App.configWeb.config文件中:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" />
      <bindingRedirect oldVersion="4.0.0.0" newVersion="4.5.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

我没有测试过这个确切的场景,但是此配置在类似情况下对我有所帮助。


0

正如Josh所提到的,我在一个包含Web API项目和几个库项目的解决方案中遇到了这个问题,其中一个库项目无法通过构建,错误显示Unity属性不是“有效”属性,然后其中一个错误显示:The type 'System.Attribute' is defined in an assembly that is not referenced. You must add a reference to assembly System.Runtime.

建议使用“更新”的4.5.2开发人员包是我已经安装的,所以它对我没有帮助。我猜想可能只是版本不匹配而已。因此,我查看了每个项目的属性,并且发现其中一个基本库是针对4.5进行定位,而其他所有库都是针对4.5.2进行定位的。我将那个库也改为定位到4.5.2,然后错误就消失了。


0

我在VS 2015的一些解决方案中遇到了这个问题,甚至在同一台工作站上的同一个解决方案中也出现了这个问题。更改.NET版本为4.6后,错误开始出现。

解决方案很简单:关闭解决方案并删除与解决方案相同文件夹中的隐藏.vs文件夹

按照其他答案建议添加缺失的引用也可以解决问题,但即使您再次删除引用,错误仍然得到解决。


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