Adicionei um assembly com nome fraco ao meu projeto do Visual Studio 2005 (que é fortemente nomeado). Agora estou recebendo o erro:
"O conjunto referenciado 'xxxxxxxx' não tem um nome forte"
Preciso assinar esta montagem de terceiros?
Adicionei um assembly com nome fraco ao meu projeto do Visual Studio 2005 (que é fortemente nomeado). Agora estou recebendo o erro:
"O conjunto referenciado 'xxxxxxxx' não tem um nome forte"
Preciso assinar esta montagem de terceiros?
Respostas:
Para evitar esse erro, você pode:
Você encontrará instruções sobre como assinar assemblies de terceiros no .NET-fu: Assinando um assembly não assinado (sem atrasar a assinatura) .
Assinando Assembleias de Terceiros
O princípio básico para assinar uma sede é
Desmonte a montagem usando
ildasm.exe
e salve o idioma intermediário (IL):Reconstrua e assine a montagem:
Corrigindo referências adicionais
As etapas acima funcionam bem, a menos que seu assembly de terceiros ( A.dll ) faça referência a outra biblioteca ( B.dll ) que também precisa ser assinada. Você pode desmontar, recriar e assinar o A.dll e o B.dll usando os comandos acima, mas em tempo de execução, o carregamento do B.dll falhará porque o A.dll foi originalmente criado com uma referência à versão não assinada do B.dll .
A correção para esse problema é corrigir o arquivo IL gerado na etapa 1 acima. Você precisará adicionar o token de chave pública do B.dll à referência. Você recebe esse token chamando
que fornecerá a seguinte saída:
A última linha contém o token de chave pública. Você precisará procurar no IL do A.dll a referência ao B.dll e adicionar o token da seguinte maneira:
fonte
Expanda o arquivo de projeto que está usando o projeto que "não possui uma chave de nome forte" e procure o
.snk
arquivo (.StrongNameKey).Navegue até esse arquivo no Windows Explorer (apenas para saber onde ele está).
De volta ao Visual Studio no projeto que não "possui uma chave de nome forte", faça
<Browse>
para o.snk
arquivo que você encontrou anteriormenteIsso deve fazer o truque. Isso resolveu um problema para mim para um projeto usando um formulário dentro de outro projeto na mesma solução.
Espero que ajude.
fonte
Eu estava procurando a solução para o mesmo problema e desmarcar a opção "Assinar a montagem" funciona para mim:
(como você pode notar, a captura de tela vem do VS2010, mas espero que ajude alguém)
fonte
Eu escrevi uma ferramenta para criar assemblies de sinal com nome forte automaticamente, incluindo aqueles para os quais você não possui o código-fonte ou projetos que foram abandonados. Ele usa muitas das técnicas descritas nas respostas de maneira simples, sem nenhuma das falhas ou inconvenientes das ferramentas existentes ou das instruções datadas.
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
Espero que isso ajude qualquer pessoa que precise assinar uma assembléia de terceiros sem ter que pular os bastidores para chegar lá.
fonte
Você pode usar montagens não assinadas se sua montagem também não estiver assinada.
fonte
A assinatura da montagem de terceiros funcionou para mim:
http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name
EDIT : aprendi que é útil publicar etapas caso o artigo vinculado não seja mais válido. Todo o crédito vai para Hiren Khirsaria :
Execute o prompt de comando do visual studio e vá para o diretório em que sua DLL estava localizada.
For Example my DLL is located in
D:/hiren/Test.dll
Agora crie o arquivo IL usando o comando abaixo.
D:/hiren> ildasm /all /out=Test.il Test.dll
(este comando gera a biblioteca de códigos)Gere uma nova chave para assinar seu projeto.
D:/hiren> sn -k mykey.snk
Agora assine sua biblioteca usando o
ilasm
comandoD:/hiren> ilasm /dll /key=mykey.snk Test.il
fonte
Como assinar um assembly de terceiros não assinado
sn
ildasm
eilasm
sn –k Cool.Library.snk
para criar um novo par de chavesildasm Cool.Library.dll /out:Cool.Library.il
desmontar a bibliotecamove Cool.Library.dll Cool.Library.unsigned.dll
para manter a biblioteca original como um backupilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
remontar a biblioteca com um nome fortepowershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
para obter o nome completo da montagem. Você precisará desse bit se precisar fazer referência à DLL em arquivos de configuração externos, como web.config ou app.config.fonte
Eu tinha esse problema para um aplicativo que tinha um nome forte e tive que alterá-lo para fazer referência a um assembly com um nome não muito forte, então desmarquei a opção 'Sign the assembly' na seção Signing das propriedades do projeto, mas ele ainda reclamou. Achei que tinha que ser um artefato em algum lugar causando o problema, já que fiz todo o resto corretamente e foi exatamente isso. Encontrei e removi a linha: [assembly: AssemblyKeyFile ("yourkeyfilename.snk")] de seu arquivo assemblyInfo.cs. Então não crie reclamações depois disso.
fonte
Eu estava correndo para isso com uma dll ServiceStack que eu tinha instalado com nuget. Acontece que havia outro conjunto de dlls disponíveis rotuladas como assinadas. Não será a resposta para todos, mas pode ser necessário apenas verificar se há uma versão assinada do seu assembly.
fonte
Para mim, meu problema era que eu tinha dois dos mesmos pacotes NuGet instalados com versões diferentes.
fonte
A remoção da marca de seleção "Assinar a montagem" na guia "Assinatura" funciona como disse @Michal Stefanow.
Adicionar aqui é a maneira mais simples de assinar seus próprios arquivos e / ou arquivos de outras pessoas. Você só precisa adicionar esta linha sob a "linha de comando do evento Pós-compilação":
Você pode assinar os arquivos de outras pessoas ou seus próprios arquivos, e quantos quiser.
fonte
Pergunta antiga, mas estou surpreso que ninguém tenha mencionado ilmerge ainda. O ilmerge é da Microsoft, mas não é fornecido com o VS ou os SDKs. Você pode baixá-lo aqui embora. Há também um repositório do github . Você também pode instalar a partir do nuget:
Usar:
Se necessário, você pode gerar seu próprio arquivo de chave usando sn (do VS):
fonte
1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
2> Install-Package -Name ILMerge
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45
Situação: você tinha o projeto A, B, C, D na solução X, Y
Projeto A, B, C em X Projeto A, C, D em Y
Preciso usar o projeto C no projeto A, mas depois não uso. No projeto de depuração bin A tinha C.dll.
Se eu compilar a solução X, tudo de bom (nesta solução, excluo a referência A -> C.), mas na solução Y, recebo esse problema.
A solução é excluir C.dll no projeto A bin Debug
fonte
Primeiro, verifique se todos os pacotes de nuget estão na mesma versão em todos os projetos em sua solução. por exemplo, você não deseja que um projeto faça referência ao NLog 4.0.0.0 e outro projeto faça referência ao NLog 4.1.0.0. Em seguida, tente reinstalar pacotes nuget com
Update-Package -reinstall
Eu tinha 3 assemblies de terceiros que foram referenciados pelo meu assembly A e apenas 2 foram incluídos nas referências do meu assembly B, que também referenciaram A.
A referência ausente ao assembly de terceiros foi adicionada pelo comando update package e o erro desapareceu.
fonte