Non è stato possibile aggiungere un riferimento alla dll


95

Quando aggiungo un file .dll come riferimento nell'applicazione C # viene visualizzato un errore:

Non è stato possibile aggiungere un riferimento a ".... dll". Assicurati che il file sia accessibile e che sia un assembly o un componente COM valido.

ILDissassembler dice che non esiste un'intestazione CLR valida, quindi provo a registrarla usando regsvr32 e questo mi dà un altro errore:

Il modulo "" è stato caricato ma la chiamata a DLLRegisterServer non è riuscita con codice di errore "0x80004005"

Sto usando la versione definitiva di VS2010 su una macchina Windows 7 a 64 bit. Quale potrebbe essere il problema?

Grazie per eventuali suggerimenti / risposte

Risposte:


53

Quanto segue ha funzionato per me:

Risposta breve

Eseguire quanto segue tramite riga di comando (cmd):

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

E verrà creata una DLL valida per te.

Risposta più lunga

  • Apri cmd

  • Trova TlbImp.exe. Probabilmente si trova in C: \ Programmi (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Se non riesci a trovarlo, vai nella tua cartella principale (C: \ o D :) ed esegui:

    dir tlbimp.exe /s              //this will locate the file.
  • Esegui tlbimp.exe e mettici dietro la tua dll. Esempio: se la tua dll è cvextern.dll. Puoi eseguire:

    TlbImp.exe cvextern.dll
  • Una nuova dll è stata creata nella stessa cartella di tlbimp.exe. Puoi usarlo come riferimento nel tuo progetto.

5
Un altro modo per accedere a TlbImp.exe è aprire un prompt dei comandi di Visual Studio.
Scott

75
@Memet Dopo aver provato questo che ho ricevuto, TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.qualche suggerimento?
Dineshkumar

1
Il file di input C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll "non è una libreria dei tipi valida
Christine

7
Avendo lo stesso errore dichiarato da Dineshkumar Ponnusamy. Per favore aiutami
Deathrace

1
Quando avresti bisogno di usare TLBMP? Normalmente in VS2015 se aggiungi semplicemente il riferimento alla DLL COM dalla finestra dei riferimenti, si occupa di tutto questo per te.
UuDdLrLrSs

20

È possibile aggiungere una DLL (o EXE) a un progetto solo se si tratta di un assembly .NET. Se non lo è, vedrai questo messaggio di errore.

regsvr32 fa anche alcuni presupposti sulla struttura e sulla funzione esportata nella DLL. È passato un po 'di tempo da quando l'ho usato, ma ha a che fare con la registrazione dei server COM, quindi devono essere disponibili determinati punti di ingresso. Se regsvr32 non riesce, la DLL non fornisce quei punti di ingresso e la DLL non contiene un componente COM.

L'unica possibilità per utilizzare la DLL è importarla come qualsiasi altro binario non .NET, ad esempio quando si utilizzano determinate API Win32. C'è un vecchio articolo di MSDN Magazine che potrebbe essere utile. Vedere il seguente aggiornamento per informazioni su dove ottenere l'articolo.

Aggiornamento 12 marzo 2018: il collegamento a MSDN Magazine non funziona più come una volta nell'agosto 2010. L'articolo di Jason Clark è intitolato ".NET Column: Calling Win32 DLLs in C # with P / Invoke". È stato pubblicato nel numero di luglio 2010 di MSDN Magazine. La "Wayback Machine" contiene l'articolo qui al momento (la formattazione è limitata). L'intero numero di luglio 2010 di MSDN Magazine è disponibile qui (solo formato HCM, istruzioni su come utilizzare i file HCM qui ).


C'è un modo per assicurarsi che il compilatore inserisca un file .dll nella cartella di output anche se non è un riferimento?
Kyle Delaney

1
@ KyleDelaney Non credo che il compilatore possa farlo. Considererei di inserire un comando di copia o xcopy nell'evento pre-build / post-build del progetto / soluzione. È manuale, tuttavia, ma generalmente i riferimenti non cambiano troppo spesso e una suite di test adeguata dovrebbe rilevare i casi in cui ti sei dimenticato di aggiornare i comandi eseguiti nell'evento pre-build / post-build.
Manfred

Grazie per la risposta!
Kyle Delaney

Il link all'articolo è morto.
Roald

@Roald Grazie. Sì, il collegamento è effettivamente interrotto. Microsoft fornisce solo il formato HCM dell'intero numero di MSDN Magazine con un URL diverso. The Wayback Machine ha anche un'istantanea del solo articolo in formato HTML con un aspetto semplificato. Ho aggiornato la risposta per riflettere questo e ho anche rimosso il collegamento interrotto dalla mia risposta. Spero che questo ti aiuti.
Manfred

12

Ho usato il walker delle dipendenze per controllare i riferimenti interni che la dll aveva. Risulta che aveva bisogno del runtime VB msvbvm60.dll e poiché la mia scatola di sviluppo non lo ha installato, non sono stato in grado di registrarlo utilizzando regsvr32

Questa sembra essere la risposta alla mia domanda originale per ora.


Nel mio caso, ho dovuto eliminare la cartella obj per il progetto a cui stavo cercando di fare riferimento e quindi ho ricostruito il progetto.
Tolu

7

Assicurati che il tuo compilatore sia impostato su x86 se stai cercando di fare riferimento a una dll x86 ...

Avevo problemi simili ... come accennato in precedenza, cercando di utilizzare OLEDB per accedere a un file Excel dal mio codice C # in Visual Studio 2012.

Continuavo a ricevere errori sulla libreria di Access non accessibile ma sapevo di averla caricata.

Durante il debug, mi sono reso conto che sto compilando per 64 bit ma ho caricato Office x86. Anche se ho caricato la libreria di Access per 32 bit, non è mai stata utilizzata dall'app ... e quindi non era accessibile.

Ecco cosa stavo usando in C #:

"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + strFilePath + "; Extended Properties = 'Excel 12.0 Xml; HDR = Yes'";

... ho ricevuto un errore

Non appena ho cambiato il compilatore a x86 ha funzionato


2

Mi sono appena imbattuto in quel problema e dopo tutte le spiegazioni su come risolverlo con il prompt dei comandi ho scoperto che se lo aggiungi direttamente al progetto puoi semplicemente includere la libreria su ogni pagina che è necessaria


2

Ho lo stesso problema con l'importazione di WinSCard.dll nel mio progetto. Mi occupo di importare direttamente da dll in questo modo:

[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);

Puoi aggiungerlo per separare il progetto e quindi aggiungere un riferimento dal tuo progetto principale.


1

Ho riscontrato questo problema dopo che il mio PC è stato riavviato durante la creazione della soluzione. I miei due riferimenti sono andati, quindi ho dovuto ricostruire i miei due progetti manualmente e quindi ho potuto aggiungere i riferimenti senza errori.


1

Non è possibile aggiungere un riferimento a una DLL nativa . Tuttavia è possibile includerli nella soluzione (fare clic con il pulsante destro del mouse sulla soluzione, selezionare "Aggiungi file esistente"), ma non verrà fatto riferimento a meno che non si dichiari qualcosa di simile

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

Forse c'è una sorta di DLL wrapper , a cui stai effettivamente facendo riferimento e che contiene le importazioni DLL.

A volte, puoi fare riferimento alla DLL wrapper ma non riesci ancora a far funzionare il tuo programma, dove il messaggio di errore suggerisce di assicurarti che il file esista e che tutte le dipendenze siano disponibili.

Questo problema è dovuto al fatto che l'assembly che si sta tentando di aggiungere è mirato e compilato solo per un'architettura del processore x86 o x64 .

Prova a cambiare la piattaforma di destinazione in x86 o x64 in Build -> Configuration Manager .


1

Avevo bisogno di cambiare l'architettura a x86 da x64 nel gestore di configurazione e copiare la mia dll a 32 bit (linguaggio C - pcProxAPI.dll) nella nuova cartella creata da questo .. Questo è in cima ai passaggi descritti da "Sashus" di seguito .

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


Questo era anche il problema per me.
rogue39nin

ma se l'impostazione predefinita non è x86 né x64? ma .... "Any Cpu" si è presentato ...?
gumuruh

codeproject.com/articles/1160645/… Qualsiasi cpu potrebbe funzionare anche se copi la dll a 32 bit lì
boateng

1

Ho avuto lo stesso problema quando ho provato ad aggiungere una DLL che avevo appena codificato in C ++ al mio nuovo progetto C #. Si è scoperto che avevo bisogno di impostare le proprietà del progetto C ++ da cui proviene la mia dll:

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

Perché anche il progetto C # in cui volevo usare questa dll era impostato in questo modo (aveva le stesse proprietà impostate su /clr).


Esplora soluzioni> Proprietà> Proprietà di configurazione
Yuresh Karunanayake

@gumuruh Se intendi "cos'è clr?", CLR è docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

Ho affrontato un problema simile. Stavo cercando di aggiungere il riferimento di una DLL .net 2.0 a un progetto .Net 1.1. Quando ho provato ad aggiungere una versione precedente di .dll che era conforme a .Net 1.1. ha funzionato per me.


0

Per chiunque altro cerchi aiuto su questo argomento, o stia sperimentando un'eccezione FileNotFoundException o FirstChanceException, controlla la mia risposta qui:

Una prima eccezione di possibilità di tipo "System.IO.FileNotFoundException" si è verificata in mscorlib.ni.dll - Windows Phone

In generale devi essere assolutamente certo di soddisfare tutti i requisiti per fare il riferimento: so che è la risposta ovvia, ma probabilmente stai trascurando un requisito relativamente semplice.


Esamina le differenze tra le versioni del framework in relazione al riferimento: molto spesso l'utilizzo di una versione del framework più recente non dovrebbe fare la differenza.
JHaps

0

Ho riscontrato questo errore durante la scrittura di un servizio Windows. Stavo eseguendo Visual Studio come amministratore in modo che i miei comandi di post compilazione installassero automaticamente il mio servizio. Ho notato che quando ho chiuso tutto e ho eseguito VS normalmente (non come amministratore), mi ha permesso di aggiungere i riferimenti senza errori.

Spero che questa soluzione funzioni per te.


0

Normalmente in Visual Studio 2015 dovresti creare il progetto dll come progetto C ++ -> CLR dai modelli di Visual Studio, ma puoi tecnicamente abilitarlo dopo il fatto:

La proprietà critica viene definita Common Language Runtime Supportimpostata nella configurazione del progetto. Si trova sotto Configuration Properties > General > Common Language Runtime Support.

Quando si esegue questa operazione, VS probabilmente non aggiornerà l'opzione "Target .NET Framework" (come dovrebbe). Puoi aggiungerlo manualmente scaricando il tuo progetto, modificando il file your_project.xxproj e aggiungendo / aggiornando il Target .NET framework Versiontag XML.

Per un esempio, suggerisco di creare una nuova soluzione come progetto C ++ CLR e di esaminare l'XML lì, forse anche differendolo per assicurarsi che non ci sia nulla di molto importante che sia fuori dall'ordinario.


0

La mia risposta è un po 'in ritardo, ma come rapido test, assicurati di utilizzare l'ultima versione delle librerie.

Nel mio caso, dopo aver aggiornato una libreria nuget che faceva riferimento a un'altra libreria che causava il problema, il problema è scomparso.


0

È possibile aggiungere manualmente il file .dll. Ad esempio, se desideri aggiungere un file dll nella tua applicazione WPF e non sei in grado di farvi riferimento nel tuo progetto

(Errore di acquisizione: non è stato possibile aggiungere un riferimento a ".... dll". Assicurati che il file sia accessibile e che sia un assembly o un componente COM valido),

quindi COPIA il file dll e INCOLLA nel PROGETTO DI INSTALLAZIONE (nella cartella dell'applicazione).


0
  1. avvia cmd.exe e digita:
  2. Regsvr32% dllpath%
  3. "% dllpath%" sostituisce il percorso dll
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.