Debe agregar una referencia al ensamblado 'netstandard, Version = 2.0.0.0

124

El proyecto es una aplicación web ASP.NET MVC dirigida a .NET Framework 4.6.1.

De repente (se actualizaron algunos paquetes de NuGet) comencé a recibir el siguiente error durante el tiempo de ejecución:

CS0012: El tipo 'System.Object' se define en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'.

En mi vista principal Index.cshtml, en una línea donde hago uso de@Html.ActionLink

Tengo .NET Core SDK 2.0 y .NET Framework 4.7.1 instalados en mi máquina, pero no quiero incluir una referencia. Esta es solo una aplicación web .NET Framework, está alojada en Windows IIS donde el marco instalado es 4.6.1, no hay NET Core instalado en el servidor.

Entonces, ¿por qué pide agregar una referencia a netstandard? ¿Cómo puedo solucionarlo sin hacer referencia netstandarda Windows .NET Framework 4.6.1 completo?

Revisé una confirmación anterior que funcionó bien y todavía recibo este error. Por lo tanto, no está relacionado con la actualización de los paquetes NuGet. Parece ser algo en mi máquina de desarrollo local.

Si publica la aplicación en un directorio y la ejecuta con IIS, funciona.

Enlace a .csproj gist

paquetes.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.5.0.2" targetFramework="net46" />
  <package id="BundleTransformer.Core" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Handlebars" version="1.9.73" targetFramework="net46" />
  <package id="BundleTransformer.Less" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Yui" version="1.9.52" targetFramework="net46" />
  <package id="Dapper" version="1.42" targetFramework="net46" />
  <package id="EcmaScript.Net" version="1.0.1.0" targetFramework="net46" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net46" />
  <package id="Glimpse" version="1.8.6" targetFramework="net46" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net46" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.Core" version="1.2.4" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.V8" version="1.3.0" targetFramework="net46" />
  <package id="jQuery" version="2.1.3" targetFramework="net46" />
  <package id="jQuery.Validation" version="1.13.1" targetFramework="net46" />
  <package id="LowercaseDashedRoute" version="1.0.14" targetFramework="net46" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net46" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
  <package id="Moment.js" version="2.10.2" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
  <package id="NWebsec" version="5.1.1" targetFramework="net46" />
  <package id="NWebsec.Core" version="2.1.0" targetFramework="net46" />
  <package id="NWebsec.Mvc" version="5.1.1" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="Respond" version="1.4.2" targetFramework="net46" />
  <package id="Sendgrid" version="6.3.0" targetFramework="net46" />
  <package id="SendGrid.SmtpApi" version="1.3.1" targetFramework="net46" />
  <package id="Serilog" version="2.6.0" targetFramework="net46" />
  <package id="Serilog.Enrichers.Environment" version="2.1.2" targetFramework="net46" />
  <package id="Serilog.Sinks.File" version="3.2.0" targetFramework="net46" />
  <package id="Serilog.Sinks.RollingFile" version="3.3.0" targetFramework="net46" />
  <package id="Serilog.Sinks.Sentry" version="2.1.4" targetFramework="net46" />
  <package id="SerilogWeb.Classic" version="2.1.17" targetFramework="net46" />
  <package id="SharpRaven" version="2.2.0" targetFramework="net46" />
  <package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.EF6" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Linq" version="1.0.108.0" targetFramework="net46" />
  <package id="Twitter.Bootstrap.Less" version="3.3.4" targetFramework="net46" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net46" />
  <package id="WebGrease" version="1.6.0" targetFramework="net46" />
  <package id="YUICompressor.NET" version="2.7.0.0" targetFramework="net46" />
</packages>

Al publicar la aplicación usando VS2017 en el sistema de archivos, aparece la siguiente advertencia en el resultado:

El siguiente ensamblado tiene dependencias en una versión de .NET Framework que es superior a la de destino y puede que no se cargue correctamente durante el tiempo de ejecución, lo que provoca un error: netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. Las dependencias son: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Debe asegurarse de que el ensamblado dependiente sea correcto para el marco de destino o asegurarse de que el marco de destino al que se dirige sea el del ensamblado dependiente.

Pero no puedo encontrar nada en System.Transactions. ¿Cómo puedo buscar qué lo hace referencia?

emzero
fuente
1
¿Qué paquetes de NuGet estás usando? ¿Está seguro de que no está haciendo referencia a uno de ASP.NET Core?
Ricardo Peres
@RicardoPeres VS2017 no le permite agregar un paquete dirigido a un marco diferente al que apunta el proyecto. He desinstalado y vuelto a instalar todos los paquetes, pero el error es el mismo. No entiendo por qué sucede e incluso por qué durante el tiempo de ejecución ...
emzero
2
El System.Data.SQLite.Corepaquete se basa en .NET Core (o .NET Standard, no busqué la fuente ni los documentos). Mire el mensaje de error al final de su archivo de proyecto.
McGuireV10
¿Por qué dijo que se basa en .NET Core? Estoy mirando el packages\System.Data.SQLite.Core.1.0.108.0\libdirectorio y contiene una carpeta para cada versión de .NET Framework, incluida la 4.6, que es lo que estoy usando. No creo que ese sea el problema aquí.
emzero
2
Cuando me enfrento a problemas sin solución como este, lo que hago es 1) anotar cuidadosamente cuál es la referencia del proyecto (o guardar el .csproj en algún lugar), 2) eliminar el archivo packages.config, eliminar todas las referencias externas (alternativamente, puede escribir un nuevo proyecto desde cero solo con los archivos estáticos originales, .cs, etc.), 3) configurar VS Nuget para usar la referencia del paquete en lugar del modo legagy packages.config docs.microsoft.com/en-us/nuget/reference/… y 4) agregue todas las referencias necesarias. La mayoría de las veces funciona y no tengo ni idea de por qué falló antes.
Simon Mourier

Respuestas:

181

Creo que la solución podría ser este problema en GitHub :

Intente agregar la referencia netstandard en web.config de esta manera: "

<system.web>
  <compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
  <httpRuntime targetFramework="4.7.1" />

Me doy cuenta de que está utilizando 4.6.1, pero la elección de .NET 4.7.1 es importante ya que las versiones anteriores de Framework no son totalmente compatibles con .NET Standard 2.0.

Lo sé por una experiencia dolorosa, cuando presenté las bibliotecas .NET Standard tuve muchos problemas con los paquetes NUGET y la ruptura de referencias. El otro cambio que debe considerar es actualizar a PackageReferences en lugar de package.configarchivos.

Consulte esta guía y es posible que también desee una herramienta para ayudar con la actualización . Sin embargo, requiere una versión VS 15.7 tardía.

Organismo estatal semiautónomo
fuente
2
Creo que cualquiera que llegue aquí también debería consultar esta excelente guía sobre la escritura de bibliotecas de código abierto del autor de Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - en particular "Evite incluyendo un destino netstandard1.x ", y use .NET 4.7.2 como la versión real más baja que admita .netstandard 2.0
Quango
Exactamente lo que se necesitaba cuando se actualizó a v4.7.2 (aplicación no principal) y obtuvo una excepción como la siguiente: "El tipo 'DateTime' se define en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'netstandard, Version = 2.0.0.0, Cultura = neutral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted
¿Esto también tiene que agregarse a las referencias en el archivo csproj, o solo es necesario en web.config?
petrosmm
1
Gran respuesta. Gracias. Estaba en proceso de actualizar un paquete de utilidades antiguo y coloqué un nuevo estándar 2.0 en su lugar. Esta aplicación web en particular tuvo problemas porque <add assembly="netstandardfaltaba y también httpRuntime no era 4.7.1- ¡Esta es la respuesta! Gracias !!
Piotr Kula
En nuestro caso, habíamos tenido varios ensamblados 2.0 estándar en uso por un proyecto ASP.Net 4.7.2 pero agregamos algo de JsonConverter del espacio de nombres System.Text.Json.Serialization a uno de los proyectos 2.0 estándar y eso causó este error. Esta solución resolvió nuestro problema.
ShaneH
35

Editar manualmente el archivo .csproj y agregar la referencia a continuación funcionó para mí.

<Reference Include="netstandard" />

Gracias a Fahad Alshaya que lo sugirió aquí .

kamilk
fuente
¿Dónde debería colocarse esto dentro del archivo del proyecto? ¿Dentro de qué otra "etiqueta"?
Ulysses Alves
1
@UlyssesAlves En algún lugar junto a otras etiquetas de referencia
kamilk
@kamilk "en algún lugar junto a otro" no es muy exacto. Bueno, miré algunos otros proyectos, pero desafortunadamente esto no funcionó para mí y decidí atacar este problema desde otra perspectiva, que no implica cambiar la versión .net del proyecto.
Ulysses Alves
1
Este funcionó para mí, también tuve que instalar NetStandard.Library a través de NuGet.
David Acero
Las pequeñas cosas que te "atrapan" ... Gran respuesta.
Benj Sanders
15

Tuve que hacer una combinación de las respuestas de otras personas en este hilo.

  1. Instale NetStandard.Library a través de NuGet
  2. Editando manualmente el archivo .csproj y agregando la referencia. <Reference Include="netstandard" />
  3. Expandiendo proyecto -> Referencias en VS Solution Explorer, haciendo clic derecho en 'netstandard' y mostrando la página de propiedades y configurando "Copiar local" en verdadero.
Damien Sawyer
fuente
3
La configuración de 'Copiar local' lo hizo por mí.
FrenkyB
1
Esta solución funciona perfectamente, además el proyecto no depende de la compilación en modo depuración.
DarkHawk
6

Me he encontrado con esto antes y probar varias cosas me ha solucionado:

  • Eliminar una carpeta bin si existe
  • Eliminar la carpeta .vs oculta
  • Asegúrese de que el paquete de orientación 4.6.1 esté instalado
  • Último esfuerzo: agregue una referencia a System.Runtime (haga clic con el botón derecho en el proyecto -> agregar -> referencia -> marque la casilla junto a System.Runtime), aunque creo que siempre he descubierto que uno de los anteriores lo ha resuelto. de hacer esto.

Además, si se trata de una aplicación principal .net que se ejecuta en el marco completo, he descubierto que debe incluir un archivo global.json en la raíz de su proyecto y apuntarlo al SDK que desea usar para ese proyecto:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Kyle Dodge
fuente
2
Probé todo, sin suerte. Este no es un proyecto de .NET Core como he dicho. Este es un .NET Framework 4.6.1 normal.
emzero
Cerrar VS, eliminar bin, eliminar .vs - estoy feliz.
Reed Shilts
5

Eliminar las carpetas Bin y Obj funcionó para mí.

Vijay Verma
fuente
5

Después de actualizar del marco 4.6.1 a 4.7.2, comenzamos a recibir este error:

"El tipo 'System.Object' se define en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'." y finalmente la solución fue agregar la referencia de ensamblaje "netstandard" mencionada anteriormente:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Raghav
fuente
1
Esto funciona. Otra cosa que funciona (sin este cambio) es agregar <Reference Include="netstandard" />al archivo csproj, PERO ... eso solo funciona si TAMBIÉN configura CopyLocal en verdadero. Nada de esto tiene sentido.
Triynko
1

Aunque este es un hilo antiguo, tuve el mismo problema hoy, la semana pasada actualicé algunos paquetes de NuGet y, aunque el sitio web MVC funcionó bien en mi máquina de desarrollo cuando publiqué en el servidor de prueba, falló.

Leí numerosas publicaciones pero ninguna funcionó. Finalmente comparé las DLL en mi contenedor local con las del servidor de prueba y descubrí que netstandard.dll no se cargó, una vez cargado, el sitio web funcionó bien, no estoy seguro de por qué la implementación web VS2017 no publicó la DLL.

Solo algo a tener en cuenta en caso de que nada de lo anterior funcione para usted.

George Phillipson
fuente
1

Experimenté esto al actualizar .NET Core 1.1 a 2.1.

Seguí las instrucciones descritas aquí .

Intente eliminar la sección <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>o <NetStandardImplicitPackageVersion>en .csproj.

h-rai
fuente
1

Comenzamos a recibir este error en el servidor de producción después de implementar la aplicación migrada de 4.6.1 a 4.7.2.

Notamos que .NET framework 4.7.2 no estaba instalado allí. Para solucionar este problema, hicimos los siguientes pasos:

  1. Instaló .NET Framework 4.7.2 desde:

    https://support.microsoft.com/en-us/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows

  2. Reinició la máquina

  3. Confirmó la versión de .NET Framework con la ayuda de ¿Cómo encuentro la versión de .NET?

Ejecutar la aplicación nuevamente con la versión .Net Framework 4.7.2 instalada en la máquina solucionó el problema.

Raghav
fuente
1

Estoy enfrentando el mismo problema que hago siguiendo la aplicación Setup Now Funciona bien

1-

<compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
      PublicKeyToken=cc7b13ffcd2ddd51"/>
      </assemblies>
    </compilation>

2- Agregar referencia

 **C:\Program Files (x86)\Microsoft Visual
Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\ADL
 Tools\2.4.0000.0\ASALocalRun\netstandard.dll**

3-

Copy Above Path Dll to Application Bin Folder on web server

Mansoor
fuente
¿Dónde está documentado esto? ¿Cómo podría alguien adivinar poner esta línea en un archivo web.config? Incidentalmente, lo que funciona igualmente bien es agregar una línea al csproj que hace referencia a "netstandard" y establecer CopyLocal en verdadero. Aun así, eso ni siquiera aparece como una posible referencia en el cuadro de diálogo de referencias en ninguna parte, por lo que la única forma de obtenerlo es agregarlo manualmente. Esto es una locura. Y estoy apuntando a .NET 4.7.2, que se supone que es totalmente compatible con el estándar .NET, pero tengo que seguir estos pasos oscuros para que funcione.
Triynko
0

Podría tener que ver con uno de estos:

  1. Instale un SDK más nuevo.
  2. En .csproj, busque la referencia Incluir = "netstandard"
  3. Verifique las versiones de ensamblado en las etiquetas de compilación en Vistas \ Web.config y Web.config.
ivw
fuente
ok, con suerte ya casi llegamos. "Agregué la referencia a NETStandard.Library en lugar de NETStandard.Library.NETFramework", consulte esta publicación: github.com/dotnet/standard/issues/391
ivw
Por lo general, System.Transactions no es parte de sus referencias, intente agregarlo en sus referencias: haga clic con el botón derecho en sus referencias si está usando la Aplicación Web o en su Proyecto si está usando el Sitio Web. busque System.Transactions en las referencias de .NET. Debería encontrar System.Transactions en sus referencias.
ivw
0

ingrese la descripción de la imagen aquí Configure Copiar Enbale en verdadero en las propiedades de netstandard.dll.

Abra el Explorador de soluciones y haga clic derecho en netstandard.dll. Establezca Copiar local en verdadero.

hani abukhurma
fuente
0

Me enfrentaba a este problema al intentar agregar una dependencia .NETStandard a una biblioteca .NET4.6.1 y compilarla en Linux con Mono 4.6.2 (la versión que viene con Ubuntu 16.04).

Finalmente lo resolví hoy; la solución requiere hacer ambas cosas:

  1. Cambiar <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>a<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion> en el archivo .csproj.
  2. Actualice su mono a una versión más nueva. Creo que 5.x debería funcionar, pero para estar seguro, puede instalar Ubuntu 20.04 (que en el momento de escribir este artículo solo está en versión preliminar), que incluye Mono 6.8.0.105.
knocte
fuente
0

Puede agregar a su web.config en su proyecto.

No funcionaría cuando lo agregas a proyectos web.config porque funciona con MVC.

MEO
fuente
0

En mi caso, descubrí que el nuget problemático era System.Memory en la versión 4.5.1. cuando se actualiza a la versión 4.5.3 funciona !!

bk
fuente
0

Aquellos que no tienen el archivo web.config. Tipo de salida diferente a la aplicación web. actualice el archivo del proyecto (.csproj) con el código de abajo.

Puede deberse a agregar / eliminar el .netframework de manera incorrecta o puede romperse de manera inesperada.

  <ItemGroup>
    <Reference Include="netstandard" />
  </ItemGroup>

Tipo de salida

  • Aplicación de consola
  • Biblioteca de clases
Thiya
fuente
-5

Este problema se basa en su versión instalada de Visual Studio y Windows, puede seguir los siguientes pasos: -

  1. Ir a la ventana de comandos
  2. degradó su PCL con el siguiente comando

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Reconstruya su proyecto.
  4. Ahora podrá ver la salida requerida
Rakendu Shukla
fuente