Que 'configuração adicional' é necessária para referenciar um assembly de modo misto do .NET 2.0 em um projeto do .NET 4.0?


526

Eu tenho um projeto no qual gostaria de usar alguns dos recursos do .NET 4.0, mas um requisito básico é que eu possa usar a estrutura System.Data.SQLite que é compilada no 2.X. Vejo menção disso possível, como a resposta aceita aqui, mas não vejo como realmente conseguir isso.

Quando tento executar meu projeto 4.0 enquanto faz referência ao assembly 2.X, recebo:

O conjunto de modo misto é construído com base 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.

Que "configuração adicional" é necessária?




IMPORTANTE: Se o erro ocorrer com a coluna "Arquivo" como SGEN, a correção precisará estar em um arquivo sgen.exe.configao lado de sgen.exe. Por exemplo, para o VS 2015, crie C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config. Fonte: SGEN modo misto montagem conteúdo do arquivo mínimos:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
ToolmakerSteve

Respostas:


686

Para usar um assembly de modo misto CLR 2.0 , você precisa modificar o arquivo App.Config para incluir:

<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

A chave é a useLegacyV2RuntimeActivationPolicybandeira. Isso faz com que o CLR use a versão mais recente (4.0) para carregar seu assembly de modo misto. Sem isso, não vai funcionar.

Observe que isso só importa para assemblies de modo misto (C ++ / CLI). Você pode carregar todos os assemblies CLR 2 gerenciados sem especificar isso app.config.


@Eed Tentei sua sugestão, mas a exceção ainda aparece. Verifiquei duas vezes o app.config que é copiado para a minha pasta EXE e ainda não funciona. Ele aparece ao usar o log4net. Não consigo encontrar nada sobre esse erro re: log4net, exceto aqui: stackoverflow.com/questions/1866735/log4net-and-net-4-0 , mas não diz muito. Alguma idéia de como obter mais informações sobre meu problema específico?
Dave

@ Dave: Isso sugere que você pode usar apenas uma versão nativa do .NET 4 do log4net - essa parece ser a melhor opção. Se há uma versão .NET 4, usá-lo ...
Reed Copsey

@ Realmente não existe uma, e eu realmente interpretei essa resposta como significando que você precisaria compilar o log4net. Acho que posso fazer isso, mas prefiro pegar o binário pré-compilado e referenciá-lo no meu projeto. Vou investigar um pouco mais. Mas você pode pensar por que mudar o app.config não o faz funcionar? Pensei que talvez tivesse que usar o programname.exe.config, mas tentei isso também e não funcionou. Na minha experiência limitada, qualquer nome de arquivo faz a mesma coisa.
Dave

19
O que me ajudou a colocar essa linha no arquivo de configuração do NUnit : <startup useLegacyV2RuntimeActivationPolicy = "true"> <supportedRuntime version = "v4.0" /> <requiredRuntime version = "v4.0.20506" /> </startup>
Filip Zawada

76
Microsoft deve fazer um botão no diálogo de exceção: "Procurar na mensagem de exceção em stackoverflow"
Davi Fiamenghi

35

Esta postagem do fórum no .NET Framework Developer Center. Pode fornecer algumas dicas.

(Adicione ao arquivo de configuração do aplicativo.)

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

2
Como essa configuração de aplicativo deve ser usada para a compilação NANT?
sagar

14

Dependendo da versão da estrutura que você está alvejando, convém procurar aqui a string correta:

http://msdn.microsoft.com/en-us/library/ee517334.aspx

Eu perdi horas tentando descobrir por que minha versão direcionada para o cliente .NET 4.0 exigia a versão completa. Eu usei isso no final:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0.30319" 
               sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

11

Depois de definir o arquivo app.config , o visual studio gerará uma cópia na pasta bin denominada App.exe.config . Copie isso para o diretório do aplicativo durante a implantação. Parece óbvio, mas surpreendentemente muitas pessoas perdem esse passo. Os desenvolvedores do WinForms não são usados ​​para configurar arquivos :).


Outra maneira é excluir o app.config e, em seguida, adicionar um novo em Projeto-> Adicionar-> Novo item e escolher Geral-> Arquivo de Configuração do Aplicativo (que não é o mesmo que criar um arquivo de texto chamado app.config)
smirkingman 26/03

8

Usar assemblies 2.0 e 4.0 juntos não é muito simples.

A ORDEM das declarações da estrutura suportada no app.config realmente afeta a exceção do modo misto que está sendo lançado. Se você inverter a ordem da declaração, receberá um erro no modo misto. Este é o objetivo desta resposta.

Portanto, se você receber o erro em um aplicativo Windows Forms, tente isso, principalmente aplicativos Windows Forms.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

Ou se o projeto não for Windows Form. Em um projeto da Web, adicione-o ao arquivo web.config.

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"></supportedRuntime>
  </startup>

7

Conseguiu resolver o problema adicionando o elemento "startup" com o conjunto de atributos "useLegacyV2RuntimeActivationPolicy" .

<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
</startup>

Mas teve que colocá-lo como o primeiro elemento filho da marca de configuração no App.config para que ele entre em vigor .

<?xml version="1.0"?>
  <configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      <supportedRuntime version="v2.0.50727"/>
    </startup>
  ......
....

1
O que aconteceu com aquele version="v2.0"?
SamB

1
O número da compilação é necessário para 2.0, mas não para 4.0, portanto, a versão superior está incorreta. A parte inferior está correta.
ickydime

5

O exemplo acima não funcionou para mim (estou trabalhando em um aplicativo da web) - mas isso ...

Edite o arquivo sgen.exe.config na pasta (eu tive que criar um primeiro); C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools (Há também um na pasta v7.0, mas não preciso alterá-lo, estou usando o VS2012)

Os conteúdos do XML devem ficar assim (o mesmo nas respostas anteriores)

<?xml version ="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
    </startup>
</configuration>

5

Se você estiver trabalhando em um serviço da Web e o assembly v2.0 for uma dependência que foi carregada pelo WcfSvcHost.exe , você deverá incluir

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

em .. \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ WcfSvcHost.exe.config arquivo

Dessa forma, o Visual Studio poderá enviar as informações corretas através do carregador em tempo de execução.


4

Corri para esse problema quando mudamos para o Visual Studio 2015 . Nenhuma das respostas acima funcionou para nós. No final, funcionamos adicionando o seguinte arquivo de configuração a TODOS os executáveis ​​do sgen.exe na máquina

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

Particularmente nesse local, mesmo quando segmentávamos o .NET 4.0:

Ferramentas C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6


você pode ser mais específico? Você quer dizer que você adicionou essas opções de configuração a todos os arquivos * .config existentes ou que criou um arquivo .config para o sgen.exe?
Adam Spicer

Para o meu, eu estava tendo esse problema com o Visual Studio 2015 Test Projects. Este post me ajudou. devbraindump.wordpress.com/2015/07/29/hello-world
Adam Spicer

1
@AdamSpicer Adicionamos isso a todos os arquivos .config de todos os sgen.exe. Se não existia, criamos um.
Executar CMD

3

Eu usei esta configuração:

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

Trabalhou para mim


3
deve ser v2.0.50727, para o número v2.0 build é necessário, mas para v4.0 não é necessário número de compilação
linquize

1

Eu tive esse problema ao atualizar para o Visual Studio 2015 e nenhuma das soluções postadas aqui fez alguma diferença, embora a configuração esteja correta no local da alteração. Corrigi esse problema adicionando esta configuração:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

Para: C: \ Arquivos de programas (x86) \ Microsoft Visual Studio 14.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ TE.ProcessHost.Managed.exe.config

Em seguida, reiniciei o Visual Studio.


0

Eu encontrei uma maneira de contornar isso depois de 3-4 horas de pesquisa no Google. Eu adicionei o seguinte

<startup selegacyv2runtimeactivationpolicy="true">
  <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>

Se isso não resolver o seu problema, então -> Nas referências do projeto em Right Click on DLLque você está recebendo o erro -> Select Properties-> Check the Run-time Version-> Se estiver, v2.0.50727então sabemos o problema. O problema é: - você está tendo A 2.0 Version of respective DLL. solução é: - Você pode, delete the respective DLLnas referências do projeto e, download the latest version of DLL'sno site correspondente, adicionar a referência da referência mais recente da DLL da versão, para que funcione.


1
Isso seria corrigido porque você está assumindo que a versão mais recente da DLL é compilada em uma versão mais recente do .NET?
Lucas

0

Eu estava enfrentando esse mesmo erro e passei sempre adicionando as instruções de inicialização sugeridas a vários arquivos de configuração em minha solução, tentando isolar a incompatibilidade da estrutura. Nada funcionou. Também adicionei informações de inicialização aos meus esquemas XML . Isso também não ajudou. Examinar o arquivo real que estava causando o problema (que apenas diria que foi "movido ou excluído") revelou que na verdade era o License Compiler (LC).

A exclusão do arquivo licens.licx incorreto parece ter corrigido o problema.


0

Eu estava enfrentando um problema semelhante ao migrar algum código do VS 2008 para o VS 2010. Fazer alterações no arquivo App.config resolveu o problema para mim.

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"
         sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>

0

Adicione o seguinte neste local C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Tools \ x64 FileName: sgen.exe.config (se você não encontrar este arquivo, crie e adicione um)

 <?xml version ="1.0"?>

<configuration>
 <runtime>        
        <generatePublisherEvidence enabled="false"/>    
    </runtime>

    <startup useLegacyV2RuntimeActivationPolicy="true">

                <supportedRuntime version="v4.0" />

    </startup>    

</configuration>

Fazer isso resolveu o problema


0

Eu uso

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

Funciona, mas logo antes da </configuration>tag, caso contrário, a tag de inicialização não funciona corretamente


-1

Também tive esse problema com a biblioteca de classes, se alguém tiver o problema com a biblioteca de classes adicionado ao seu aplicativo principal. Basta adicionar

<startup useLegacyV2RuntimeActivationPolicy="true">

para o aplicativo principal que seria escolhido pela biblioteca de classes.


Esta é uma solução incompleta. os nomes na configuração são sensíveis, e você se esqueceu de um U.
Chuck Dee
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.