Você deve adicionar uma referência ao assembly 'netstandard, Versão = 2.0.0.0

124

O projeto é um ASP.NET MVC Web App voltado para o .NET Framework 4.6.1.

De repente (alguns pacotes NuGet foram atualizados) comecei a receber o seguinte erro durante o tempo de execução:

CS0012: O tipo 'System.Object' é definido em um assembly que não é referenciado. Você deve adicionar uma referência ao assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'.

Na minha visão principal Index.cshtml, em uma linha onde faço uso de@Html.ActionLink

Tenho o .NET Core SDK 2.0 e o .NET Framework 4.7.1 instalados em minha máquina, mas não quero incluir uma referência a eles. Este é apenas um aplicativo da web .NET Framework, está hospedado no Windows IIS onde a estrutura instalada é 4.6.1, não há NET Core instalado no servidor.

Então, por que está pedindo para adicionar uma referência a netstandard? Como posso corrigir isso sem fazer referência netstandarda todo o Windows .NET Framework 4.6.1?

Eu verifiquei um commit anterior que funcionou bem e ainda estou recebendo este erro. Portanto, não está relacionado aos pacotes NuGet sendo atualizados. Parece ser algo na minha máquina de desenvolvimento local.

Se você publicar o aplicativo em um diretório e executá-lo com o IIS, ele funcionará.

Link para .csproj gist

packages.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>

Ao publicar o aplicativo usando VS2017 no sistema de arquivos, recebo o seguinte aviso na saída:

O seguinte assembly tem dependências de uma versão do .NET Framework superior ao destino e pode não carregar corretamente durante o tempo de execução, causando uma falha: netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. As dependências são: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Você deve garantir que o assembly dependente esteja correto para a estrutura de destino ou certifique-se de que a estrutura de destino que você está endereçando seja aquela do assembly dependente.

Mas não consigo encontrar nada System.Transactions. Como posso pesquisar o que está referenciando isso?

emzero
fonte
1
Quais pacotes NuGet você está usando? Tem certeza de que não está fazendo referência a um ASP.NET Core?
Ricardo Peres
@RicardoPeres VS2017 não permite adicionar um pacote visando uma estrutura diferente daquela que o projeto está direcionando. Desinstalei e reinstalei todos os pacotes, mas o erro é o mesmo. Eu não entendo porque isso acontece e mesmo porque durante o tempo de execução ...
emzero
2
O System.Data.SQLite.Corepacote é baseado em .NET Core (ou .NET Standard, não procurei a fonte ou os documentos). Observe a mensagem de erro no final do arquivo de projeto.
McGuireV10
Por que você disse que é baseado no .NET Core? Estou olhando para o packages\System.Data.SQLite.Core.1.0.108.0\libdiretório e ele contém uma pasta para cada versão do .NET Framework, incluindo 4.6, que é o que estou usando. Não acho que seja esse o problema aqui.
emzero
2
Quando enfrento problemas insolúveis como este, o que faço é 1) observar cuidadosamente quais são as referências do projeto (ou salvar o .csproj em algum lugar), 2) remover o arquivo packages.config, remover todas as referências externas (alternativamente, você pode escrever um novo projeto do zero apenas com os arquivos estáticos originais, .cs, etc.), 3) configurar o VS Nuget para usar a Referência do pacote em vez do modo legagy packages.config docs.microsoft.com/en-us/nuget/reference/… e 4) adicione todas as referências necessárias de volta. Na maioria das vezes, funciona e não tenho ideia de por que falhou antes.
Simon Mourier

Respostas:

181

Acho que a solução pode ser este problema no GitHub :

Tente adicionar a referência netstandard em web.config como este: "

<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" />

Sei que você está usando o 4.6.1, mas a escolha do .NET 4.7.1 é significativa, pois as versões anteriores do Framework não são totalmente compatíveis com o .NET Standard 2.0.

Sei disso por experiência dolorosa, quando apresentei as bibliotecas .NET Standard, tive muitos problemas com pacotes NUGET e referências quebrando. A outra mudança que você precisa considerar é a atualização para PackageReferences em vez de package.configarquivos.

Consulte este guia e você também pode querer uma ferramenta para ajudar na atualização . No entanto, ele requer uma versão final do VS 15.7.

Quango
fonte
2
Acho que quem chega aqui também deve olhar para esta excelente orientação sobre como escrever libs de código aberto pelo autor de Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - em particular "Evite incluindo um alvo netstandard1.x ", e usar .NET 4.7.2 como a versão real mais baixa que suporta .netstandard 2.0
Quango
Exatamente o que era necessário quando atualizado para v4.7.2 (aplicativo não principal) e obteve uma exceção como a seguinte: "O tipo 'DateTime' é definido em um assembly que não é referenciado. Você deve adicionar uma referência ao assembly 'netstandard, Versão = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted
Isso também precisa ser adicionado às referências no arquivo csproj ou só é necessário no web.config?
petrosmm
1
Ótima resposta. Obrigado. Eu estava atualizando um antigo pacote de utilitários e coloquei um novo padrão 2.0 em seu lugar. Este aplicativo da web em particular teve problemas porque <add assembly="netstandardestava faltando e também o httpRuntime não era 4.7.1- Esta é a resposta! Obrigado !!
Piotr Kula
Em nosso caso, tínhamos vários assemblies 2.0 padrão em uso por um projeto ASP.Net 4.7.2, mas adicionamos algum JsonConverter do namespace System.Text.Json.Serialization a um dos projetos 2.0 padrão e isso causou esse erro. Esta solução resolveu nosso problema.
ShaneH
35

Editar manualmente o arquivo .csproj e adicionar a referência abaixo funcionou para mim.

<Reference Include="netstandard" />

Obrigado a Fahad Alshaya que sugeriu aqui .

Kamilk
fonte
Onde isso deve ser colocado dentro do arquivo do projeto? Dentro de qual outra "tag"?
Ulysses Alves
1
@UlyssesAlves Em algum lugar próximo a outras tags de referência
kamilk
@kamilk "em algum lugar próximo a outro" não é muito preciso. Bem, eu olhei para alguns outros projetos, mas infelizmente isso não funcionou para mim e decidi atacar esse problema de outra perspectiva, que não envolve alterar a versão .net do projeto.
Ulysses Alves de
1
Este funcionou para mim, eu também tive que instalar o NetStandard.Library via NuGet.
David Acero
As pequenas coisas que "te pegam" ... Ótima resposta.
Benj Sanders
15

Eu tive que fazer uma combinação das respostas de outras pessoas neste tópico.

  1. Instale o NetStandard.Library via NuGet
  2. Editando manualmente o arquivo .csproj e adicionando a referência. <Reference Include="netstandard" />
  3. Expandindo projeto -> Referências no VS Solution Explorer, clicando com o botão direito em 'netstandard' e mostrando a página de propriedades e definindo "Copiar Local" como verdadeiro.
Damien Sawyer
fonte
3
Definir 'Copiar local' fez isso para mim.
FrenkyB
1
Esta solução funciona perfeitamente, além disso o projeto não depende de compilar em modo de depuração.
DarkHawk
6

Já deparei com isso antes e tentei várias coisas para consertar:

  • Exclua uma pasta bin, se existir
  • Exclua a pasta .vs oculta
  • Certifique-se de que o pacote de direcionamento 4.6.1 esteja instalado
  • Último Esforço de Vala: Adicione uma referência a System.Runtime (clique com o botão direito do mouse em projeto -> adicionar -> referência -> marque a caixa ao lado de System.Runtime), embora eu ache que sempre descobri que uma das opções acima resolveu isso de fazer isso.

Além disso, se este for um aplicativo principal .net em execução na estrutura completa, descobri que você precisa incluir um arquivo global.json na raiz do seu projeto e apontá-lo para o SDK que deseja usar para esse projeto:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Kyle Dodge
fonte
2
Tentei de tudo, sem sorte. Este não é um projeto .NET Core, como eu disse. Este é um .NET Framework 4.6.1 normal.
emzero
Feche o VS, exclua o compartimento, exclua .vs - estou feliz.
Reed Shilts
5

A exclusão das pastas Bin e Obj funcionou para mim.

Vijay Verma
fonte
5

Depois de atualizar da estrutura 4.6.1 para 4.7.2, começamos a receber este erro:

"O tipo 'System.Object' é definido em um assembly que não é referenciado. Você deve adicionar uma referência ao assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'." e, finalmente, a solução foi adicionar a referência de montagem "padrão da rede" mencionada acima:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Raghav
fonte
1
Isso funciona. Outra coisa que funciona (sem essa alteração) é adicionar o <Reference Include="netstandard" />ao arquivo csproj, MAS ... isso só funciona se você TAMBÉM definir CopyLocal como true. Nada disso faz algum sentido.
Triynko
1

Embora este seja um tópico antigo, tive o mesmo problema hoje, na semana passada atualizei alguns pacotes NuGet e, embora o site MVC tenha funcionado bem na minha máquina de desenvolvimento quando publiquei no servidor de teste, ele falhou.

Eu li vários posts, mas nenhum funcionou. Eu finalmente comparei as DLLs em meu compartimento local com as do servidor de teste e descobri que o netstandard.dll não foi carregado, uma vez carregado o site funcionou bem, não sei por que VS2017 web deploy não publicou a DLL.

Apenas algo a observar caso nenhuma das opções acima funcione para você.

George Phillipson
fonte
1

Eu experimentei isso ao atualizar o .NET Core 1.1 para 2.1.

Eu segui as instruções descritas aqui .

Tente remover <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>ou <NetStandardImplicitPackageVersion>seção no .csproj.

h-rai
fonte
1

Começamos a receber esse erro no servidor de produção após implantar o aplicativo migrado de 4.6.1 para 4.7.2.

Percebemos que o .NET framework 4.7.2 não foi instalado lá. Para resolver esse problema, realizamos as seguintes etapas:

  1. Instalou o .NET Framework 4.7.2 de:

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

  2. Reiniciou a máquina

  3. Confirmei a versão do .NET Framework com a ajuda de Como encontro a versão do .NET?

Executar o aplicativo novamente com a versão .Net Framework 4.7.2 instalada na máquina corrigiu o problema.

Raghav
fonte
1

Estou enfrentando o mesmo problema que faço seguindo o Setup Now Application Work bem

1-

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

2- Adicionar Referência

 **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
fonte
Onde isso está documentado? Como alguém poderia adivinhar como colocar essa linha em um arquivo web.config? Incidentalmente, o que funciona igualmente bem é adicionar uma linha ao csproj que faz referência a "netstandard" e definir CopyLocal como true. Mesmo assim, isso nem mesmo está listado como uma referência possível na caixa de diálogo de referências em qualquer lugar, então a única maneira de obtê-lo é adicioná-lo manualmente. Isso é uma loucura. E estou visando o .NET 4.7.2, que supostamente é totalmente compatível com o padrão .NET, mas preciso seguir essas etapas obscuras para fazê-lo funcionar.
Triynko
0

Pode ter a ver com um destes:

  1. Instale um SDK mais recente.
  2. Em .csproj, verifique a inclusão de referência = "netstandard"
  3. Verifique as versões do assembly nas marcas de compilação em Views \ Web.config e Web.config.
ivw
fonte
ok esperançosamente estamos quase lá. "Eu adicionei a referência a NETStandard.Library em vez de NETStandard.Library.NETFramework" verifique este post: github.com/dotnet/standard/issues/391
ivw
Normalmente System.Transactions não faz parte de suas referências, tente adicioná-lo às suas referências: clique com o botão direito nas referências se estiver usando o aplicativo da Web ou em seu projeto se estiver usando o site. encontre System.Transactions nas referências .NET. Você deve encontrar System.Transactions em suas referências.
ivw
0

insira a descrição da imagem aqui Defina Copy Enbale como true nas propriedades netstandard.dll.

Abra o Gerenciador de Soluções e clique com o botão direito em netstandard.dll. Defina Copiar local como verdadeiro.

hani abukhurma
fonte
0

Eu estava enfrentando esse problema ao tentar adicionar uma dependência .NETStandard a uma biblioteca .NET4.6.1 e compilá-la no Linux com Mono 4.6.2 (a versão que vem com Ubuntu 16.04).

Eu finalmente resolvi hoje; a solução requer fazer as duas coisas:

  1. Altere <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>para <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>no arquivo .csproj.
  2. Atualize seu mono para uma versão mais recente. Acredito que o 5.x deve funcionar, mas com certeza, você pode apenas instalar o Ubuntu 20.04 (que no momento da escrita está apenas em visualização), que inclui o Mono 6.8.0.105.
knocte
fonte
0

Você pode adicionar ao seu web.config em seu projeto.

Não funcionaria quando você o adicionasse aos projetos web.config porque funciona com MVC.

MEO
fonte
0

No meu caso, descobri que o nuget problemático era System.Memory na versão 4.5.1. quando atualizado para a versão 4.5.3 funciona !!

bk
fonte
0

Aqueles que não possuem o arquivo web.config. Tipo de saída diferente de aplicativo da web. atualize o arquivo do projeto (.csproj) com o código a seguir.

Pode causar devido à adição / remoção do .netframework de forma inadequada ou pode quebrar de forma inesperada.

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

Tipo de saída

  • Aplicação de console
  • Biblioteca de classes
Thiya
fonte
-5

Este problema é baseado na sua versão instalada do Visual Studio e Windows, você pode seguir as seguintes etapas: -

  1. Vá para a janela de comando
  2. rebaixou seu PCL com o seguinte comando

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Reconstrua seu projeto.
  4. Agora você poderá ver a saída necessária
Rakendu Shukla
fonte