Não foi possível adicionar uma referência à dll

95

Quando adiciono um arquivo .dll como referência no aplicativo C #, ele mostra um erro:

Não foi possível adicionar uma referência a ".... dll". Verifique se o arquivo está acessível e se é um assembly ou componente COM válido.

ILDissassembler diz que não há cabeçalho CLR válido, então tento registrá-lo usando regsvr32 e isso me dá outro erro:

O módulo "" foi carregado, mas a chamada para DLLRegisterServer falhou com o código de erro '0x80004005'

Estou usando a versão final do VS2010 em uma máquina Windows 7 de 64 bits. Qual pode ser o problema?

Obrigado por quaisquer dicas / respostas

user20358
fonte

Respostas:

53

O seguinte funcionou para mim:

Resposta curta

Execute o seguinte via linha de comando (cmd):

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

E uma dll válida será criada para você.

Resposta mais longa

  • Abra o cmd

  • Encontre TlbImp.exe. Provavelmente localizado em C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Se você não conseguir encontrá-lo, vá para a pasta raiz (C: \ ou D :) e execute:

    dir tlbimp.exe /s              //this will locate the file.
  • Execute tlbimp.exe e coloque sua dll atrás dele. Exemplo: se sua dll for cvextern.dll. Você pode correr:

    TlbImp.exe cvextern.dll
  • Uma nova dll foi criada na mesma pasta de tlbimp.exe. Você pode usar isso como referência em seu projeto.
Memet Olsen
fonte
5
Outra maneira de acessar TlbImp.exe é abrir um prompt de comando do Visual Studio.
Scott
75
@Memet Afer tentando isso eu tenho, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.alguma sugestão?
Dineshkumar de
1
O arquivo de entrada C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'não é uma biblioteca de tipos válida
Christine
7
Tendo o mesmo erro declarado por Dineshkumar Ponnusamy. Por favor me ajude
deathrace
1
Quando você precisa usar o TLBMP? Normalmente no VS2015, se você apenas adicionar a referência à DLL COM da janela de referências, ela cuidará de tudo isso para você.
UuDdLrLrSs
20

Você pode adicionar uma DLL (ou EXE) a um projeto somente se for um assembly .NET. Se não for, você verá esta mensagem de erro.

regsvr32 também faz certas suposições sobre a estrutura e a função exportada na DLL. Já faz um tempo desde que eu o usei, mas tem a ver com o registro de servidores COM, então certos pontos de entrada precisam estar disponíveis. Se regsvr32 falhar, a DLL não fornece esses pontos de entrada e a DLL não contém um componente COM.

A única chance de usar a DLL é importá-la como qualquer outro binário não .NET, por exemplo, quando você usa certas APIs do Win32. Há um antigo artigo da MSDN Magazine que pode ser útil. Consulte a atualização a seguir para obter informações sobre onde obter o artigo.

Atualização de 12 de março de 2018: o link para a MSDN Magazine não funciona mais como antes em agosto de 2010. O artigo de Jason Clark é intitulado "Coluna .NET: Chamando DLLs Win32 em C # com P / Invoke". Foi publicado na edição de julho de 2010 da MSDN Magazine. A "Wayback Machine" tem o artigo aqui no momento (a formatação é limitada). A edição completa da MSDN Magazine de julho de 2010 está disponível aqui (apenas formato HCM, instruções sobre como usar os arquivos HCM aqui ).

Manfred
fonte
Existe uma maneira de garantir que o compilador coloque um .dll na pasta de saída, mesmo que não seja uma referência?
Kyle Delaney
1
@KyleDelaney Não acho que o compilador possa fazer isso. Eu consideraria colocar um comando copy ou xcopy no evento pré-construção / pós-construção do projeto / solução. É manual, porém, mas geralmente as referências não mudam com muita frequência e um conjunto de testes adequado deve detectar os casos em que você se esqueceu de atualizar os comandos executados no evento de pré-construção / pós-construção.
Manfred
Obrigado pela resposta!
Kyle Delaney
O link para o artigo está morto.
Roald
@Roald Obrigado. Sim, o link está realmente quebrado. A Microsoft fornece apenas o formato HCM de toda a edição da MSDN Magazine em uma URL diferente. A Wayback Machine também tem um instantâneo apenas do artigo em formato HTML com uma aparência simplificada. Eu atualizei a resposta para refletir isso e também removi o link quebrado de minha resposta. Espero que isto ajude.
Manfred
12

Eu usei o dependency walker para verificar as referências internas que a dll estava tendo. Acontece que ele precisava do msvbvm60.dll do tempo de execução do VB e, como minha caixa de desenvolvimento não tinha isso instalado, não consegui registrá-lo usando regsvr32

Essa parece ser a resposta à minha pergunta original por enquanto.

user20358
fonte
No meu caso, tive que excluir a pasta obj do projeto que estava tentando fazer referência e, em seguida, reconstruí o projeto.
Tolu
7

Certifique-se de que seu compilador está configurado para x86 se você estiver tentando fazer referência a uma dll x86 ...

Eu estava tendo problemas semelhantes ... como mencionado acima, tentando usar OLEDB para acessar um arquivo Excel do meu código C # no Visual Studio 2012.

Continuei recebendo erros sobre a biblioteca do Access não estar acessível, mas eu sabia que a tinha carregado.

Durante o Debug, percebi que estou compilando para 64 bits, mas tenho o Office x86 carregado. Embora eu tenha carregado a biblioteca do Access para 32 bits, ela nunca foi usada pelo aplicativo ... e, portanto, não estava acessível.

Aqui está o que eu estava usando em C #:

"Provedor = Microsoft.ACE.OLEDB.12.0; Fonte de dados =" + strFilePath + "; Propriedades estendidas = 'Excel 12.0 Xml; HDR = Sim'";

... eu estava recebendo um erro

Assim que mudei o compilador para x86 ele funcionou

Robert Obergfoll
fonte
2

Acabei de encontrar esse problema e depois de todas as explicações sobre como corrigi-lo com o prompt de comando, descobri que se você adicioná-lo diretamente ao projeto, você pode simplesmente incluir a biblioteca em cada página necessária

JeffB
fonte
2

Eu tenho o mesmo problema com a importação de WinSCard.dll em meu projeto. Eu lido com isso importando diretamente da dll assim:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

Você pode adicionar isso para separar o projeto e, em seguida, adicionar uma referência do seu projeto principal.

Sashus
fonte
1

Tive esse problema depois que meu PC foi reiniciado durante a criação da solução. Minhas duas referências se foram, então tive que reconstruir meus dois projetos manualmente e então poderia adicionar referências sem erros.

Rafal Cypcer
fonte
1

Você não pode adicionar uma referência a uma DLL nativa . No entanto, você pode incluí-los na solução (clique com o botão direito na solução, selecione "Adicionar arquivo existente"), mas eles não serão referenciados a menos que você declare algo como

[DllImport("...")]
public static extern void MyFunction();

Talvez haja algum tipo de DLL de invólucro , que você está realmente referenciando e que contém as importações de DLL.

Às vezes, você pode fazer referência à DLL de invólucro, mas ainda não consegue fazer seu programa rodar, onde o prompt de erro sugere que você certifique-se de que o arquivo existe e todas as dependências estão disponíveis.

Esse problema ocorre porque o assembly que você está tentando adicionar é direcionado e compilado apenas para uma arquitetura de processador x86 ou x64 .

Apenas tente alterar a plataforma de destino para x86 ou x64 em Build -> Configuration Manager .

Leon Wolf
fonte
1

Eu precisava mudar a arquitetura para x86 de x64 no gerenciador de configuração e copiar minha dll de 32 bits (linguagem C - pcProxAPI.dll) para a nova pasta criada por esta .. Isso está no topo das etapas descritas por "Sashus" abaixo .

C: \ Projects .. \ bin \ x86 \ Debug

Boateng
fonte
Este era o problema para mim também.
rogue39nin
mas se o padrão não for x86 nem x64? mas .... "Qualquer Cpu" apareceu ...?
gumuruh
codeproject.com/articles/1160645/… Qualquer cpu pode funcionar bem se você copiar o dll de 32 bits lá
boateng
1

Tive o mesmo problema quando tentei adicionar uma dll que acabei de codificar em C ++ ao meu novo projeto C #. Acontece que eu precisava definir as propriedades do projeto C ++ de onde minha dll é:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

Porque o projeto C # no qual eu queria usar essa dll também foi definido dessa forma (tinha as mesmas propriedades definidas como /clr).

LoukMouk
fonte
Gerenciador de Soluções> Propriedade> Configuração Propriedade
Yuresh Karunanayake
@gumuruh Se você quer dizer "o que é clr?", CLR é docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk
0

Eu enfrentei um problema semelhante. Eu estava tentando adicionar a referência de uma dll .net 2.0 a um projeto .net 1.1. Quando tentei adicionar uma versão anterior do .dll que estava em conformidade no .Net 1.1. funcionou para mim.

user2623151
fonte
0

Para qualquer pessoa procurando ajuda sobre este assunto, ou tendo uma FileNotFoundException ou FirstChanceException, verifique minha resposta aqui:

Uma exceção de primeira chance do tipo 'System.IO.FileNotFoundException' ocorreu em mscorlib.ni.dll - Windows Phone

Em geral, você deve estar absolutamente certo de que está atendendo a todos os requisitos para fazer a referência - sei que é a resposta óbvia, mas provavelmente você está negligenciando um requisito relativamente simples.

JHaps
fonte
Observe as diferenças entre as versões do framework em relação à referência - muitas vezes o uso de uma versão mais recente do framework não deve fazer diferença.
JHaps de
0

Eu tive este erro ao escrever um serviço do Windows. Eu estava executando o Visual Studio como administrador para que meus comandos de pós-compilação instalassem automaticamente meu serviço. Percebi que quando fechei tudo e executei o VS normalmente (não como administrador), ele me permitiu adicionar as referências sem erros.

Espero que esta solução funcione para você.

Fütemire
fonte
0

Normalmente, no Visual Studio 2015, você deve criar o projeto dll como um C ++ -> projeto CLR a partir dos modelos do Visual Studio, mas você pode habilitá-lo tecnicamente após o fato:

A propriedade crítica é chamada de Common Language Runtime Supportdefinida na configuração do seu projeto. É encontrado em Configuration Properties > General > Common Language Runtime Support.

Ao fazer isso, o VS provavelmente não atualizará a opção 'Target .NET Framework' (como deveria). Você pode adicionar isso manualmente descarregando seu projeto, editando o arquivo your_project.xxproj e adicionando / atualizando a Target .NET framework Versiontag XML.

Por exemplo, sugiro criar uma nova solução como um projeto C ++ CLR e examinar o XML lá, talvez até mesmo alterá-lo para ter certeza de que não há nada muito importante que esteja fora do comum.

Aaron Hull
fonte
0

Minha resposta está um pouco atrasada, mas como um teste rápido, verifique se você está usando a versão mais recente das bibliotecas.

No meu caso, depois de atualizar uma biblioteca nuget que fazia referência a outra biblioteca que estava causando o problema, o problema desapareceu.

Martin Staufcik
fonte
0

Você pode adicionar o arquivo .dll manualmente. Por exemplo, se você deseja adicionar um arquivo dll em seu aplicativo WPF e não consegue consultá-lo em seu projeto

(Erro ao obter: uma referência a ".... dll" não pôde ser adicionada. Certifique-se de que o arquivo esteja acessível e que seja um assembly ou componente COM válido),

então COPIE esse arquivo dll e COLOQUE no PROJETO INSTALADOR (na pasta do aplicativo).

ARUN JOHN
fonte
0
  1. inicie o cmd.exe e digite:
  2. Regsvr32% dllpath%
  3. "% dllpath%" substitui por seu caminho dll
charles chen
fonte