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

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.

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


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.


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


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


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.


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.


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 .


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


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


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.


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.


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


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.


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.


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


0
  1. inicie o cmd.exe e digite:
  2. Regsvr32% dllpath%
  3. "% dllpath%" substitui por seu caminho dll
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.