O que 'useLegacyV2RuntimeActivationPolicy' faz na configuração do .NET 4?

214

Ao converter um projeto que usava o SlimDX e, portanto, possui código não gerenciado, para o .NET 4.0, deparei-me com o seguinte erro:

O conjunto de modo misto é construído na versão 'v2.0.50727' do tempo de execução e não pode ser carregado no tempo de execução 4.0 sem informações adicionais de configuração.

Pesquisar no Google me deu a solução, que é adicionar isso à configuração dos aplicativos:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Minha pergunta é: o que está useLegacyV2RuntimeActivationPolicyfazendo? Não consigo encontrar nenhuma documentação sobre isso.

Cameron MacFarland
fonte

Respostas:

165

Depois de um tempo (e mais pesquisas), encontrei esta entrada de blog de Jomo Fisher.

Um dos problemas recentes que vimos é que, devido ao suporte para tempos de execução lado a lado, o .NET 4.0 mudou a maneira como se vincula a assemblies de modo misto mais antigos. Esses assemblies são, por exemplo, aqueles que são compilados a partir de C ++ \ CLI. Os assemblies DirectX disponíveis atualmente são de modo misto. Se você vir uma mensagem como essa, saberá que encontrou o problema:

O conjunto de modo misto é criado na versão 'v1.1.4322' do tempo de execução e não pode ser carregado no tempo de execução 4.0 sem informações adicionais de configuração.

[Recorte]

A boa notícia para os aplicativos é que você tem a opção de voltar à ligação da era do .NET 2.0 para esses assemblies, definindo um sinalizador app.config da seguinte maneira:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
</startup>

Portanto, parece que a maneira como o tempo de execução carrega os assemblies de modo misto mudou. Não consigo encontrar detalhes sobre essa alteração ou por que ela foi feita. Mas o useLegacyV2RuntimeActivationPolicyatributo é revertido para o carregamento do CLR 2.0.

Cameron MacFarland
fonte
28
Vale a pena notar aqui que, enquanto isso, a resposta do marklios ( stackoverflow.com/questions/1604663/… ) fornece um link para sua explicação completa sobre essa alteração.
Steffen Opel
1
Uma explicação completa sobre isto pode ser encontrado no MSDN (Embora não mencione explicitamente a solução mencionada acima): msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane
E se eu adicionei isso à configuração do meu aplicativo e ao meu projeto UnitTest e ainda estou recebendo um erro de carregamento de arquivo ao executar testes. Devo postar uma nova pergunta?
CodenameCain
126

Aqui está uma explicação que escrevi recentemente para ajudar com o vazio de informações sobre esse atributo. http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (link da Internet Archive Wayback Machine)

Para citar os bits mais relevantes:

[Instalando o .NET] v4 é "sem impacto". Não deve alterar o comportamento dos componentes existentes quando instalados.

O atributo useLegacyV2RuntimeActivationPolicy basicamente permite que você diga: “Tenho algumas dependências nas APIs herdadas de shim. Por favor, faça com que eles funcionem da maneira que costumavam em relação ao tempo de execução escolhido. ”

Por que não fazemos disso o comportamento padrão? Você pode argumentar que esse comportamento é mais compatível e facilita a portabilidade de código de versões anteriores. Se você se lembrar, esse não pode ser o comportamento padrão, pois isso causaria impacto na instalação da v4, o que pode quebrar os aplicativos existentes instalados em sua máquina.

A publicação completa explica isso com mais detalhes. Na RTM, os documentos do MSDN sobre isso devem ser melhores.

Mark Miller
fonte
user20493, você pode executar seu aplicativo com a variável de ambiente COMPlus_CLRLoadLogDir definida em um diretório vazio ao qual o aplicativo tenha acesso de gravação e compartilhar os logs resultantes (verifique qualquer PII antes de compartilhar). Isso pode ajudar a explicar o que está acontecendo. O atributo de configuração pode não ser aplicado ao contexto em que seu aplicativo está sendo executado.
Mark Miller
Este link também deve ajudar a compreender qual é o problema, e que a solução está a fazer para você: msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane