No se pudo agregar una referencia a la dll

95

Cuando agrego un archivo .dll como referencia en la aplicación C #, muestra un error:

No se pudo agregar una referencia a ".... dll". Asegúrese de que el archivo sea accesible y de que sea un ensamblado o componente COM válido.

ILDissassembler dice que no hay un encabezado CLR válido, así que trato de registrarlo usando regsvr32 y eso me da otro error:

El módulo "" se cargó pero la llamada a DLLRegisterServer falló con el código de error '0x80004005'

Estoy usando la última versión de VS2010 en una máquina con Windows 7 de 64 bits. ¿Cual podría ser el problema?

Gracias por cualquier sugerencia / respuesta

user20358
fuente

Respuestas:

53

Lo siguiente funcionó para mí:

Respuesta corta

Ejecute lo siguiente a través de la línea de comando (cmd):

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

Y se creará una dll válida para usted.

Respuesta más larga

  • Abrir cmd

  • Busque TlbImp.exe. Probablemente ubicado en C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin. Si no puede encontrarlo, vaya a su carpeta raíz (C: \ o D :) y ejecute:

    dir tlbimp.exe /s              //this will locate the file.
  • Ejecute tlbimp.exe y coloque su dll detrás de él. Ejemplo: si su dll es cvextern.dll. Tu puedes correr:

    TlbImp.exe cvextern.dll
  • Se ha creado una nueva dll en la misma carpeta de tlbimp.exe. Puede usar eso como referencia en su proyecto.
Memet Olsen
fuente
5
Otra forma de acceder a TlbImp.exe es abrir un símbolo del sistema de Visual Studio.
Scott
75
@Memet Después de probar esto, tengo, ¿ TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.alguna sugerencia?
Dineshkumar
1
El archivo de entrada C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'no es una biblioteca de tipos válida
Christine
7
Tener el mismo error que declaró Dineshkumar Ponnusamy. Por favor ayúdame
deathrace
1
¿Cuándo necesitaría utilizar TLBMP? Normalmente en VS2015, si solo agrega la referencia a la DLL COM desde la ventana de referencias, se encarga de todo esto por usted.
UuDdLrLrSs
20

Puede agregar una DLL (o EXE) a un proyecto solo si es un ensamblado .NET. Si no es así, verá este mensaje de error.

regsvr32 también hace ciertas suposiciones sobre la estructura y la función exportada en la DLL. Ha pasado un tiempo desde que lo usé, pero tiene que ver con el registro de servidores COM, por lo que ciertos puntos de entrada deben estar disponibles. Si regsvr32 falla, la DLL no proporciona esos puntos de entrada y la DLL no contiene un componente COM.

La única posibilidad de usar la DLL es importarla como cualquier otro binario que no sea .NET, por ejemplo, cuando usa ciertas API de Win32. Hay un antiguo artículo de la revista MSDN que puede resultar útil. Consulte la siguiente actualización para obtener información sobre dónde obtener el artículo.

Actualización del 12 de marzo de 2018: el enlace a MSDN Magazine ya no funciona como solía hacerlo en agosto de 2010. El artículo de Jason Clark se titula "Columna .NET: Llamar a DLL de Win32 en C # con P / Invoke". Se publicó en la edición de julio de 2010 de MSDN Magazine. La "Wayback Machine" tiene el artículo aquí en este momento (el formato es limitado). La edición completa de MSDN Magazine de julio de 2010 está disponible aquí (solo formato HCM, instrucciones sobre cómo usar archivos HCM aquí ).

Manfred
fuente
¿Hay alguna forma de asegurarse de que el compilador coloque un .dll en la carpeta de salida incluso si no es una referencia?
Kyle Delaney
1
@KyleDelaney No creo que el compilador pueda hacer eso. Consideraría poner un comando copy o xcopy en el evento pre-build / post-build del proyecto / solución. Sin embargo, es manual, pero generalmente las referencias no cambian con demasiada frecuencia y un conjunto de pruebas adecuado debería detectar los casos en los que se olvidó de actualizar los comandos ejecutados en el evento pre-build / post-build.
Manfred
¡Gracias por la respuesta!
Kyle Delaney
El enlace al artículo está muerto.
Roald
@Roald Gracias. Sí, el vínculo está realmente roto. Microsoft solo proporciona el formato HCM de todo el número de MSDN Magazine en una URL diferente. La Wayback Machine también tiene una instantánea del artículo en formato HTML con una apariencia simplificada. Actualicé la respuesta para reflejar esto y también eliminé el enlace roto de mi respuesta. Espero que esto ayude.
Manfred
12

Usé el andador de dependencias para verificar las referencias internas que tenía el dll. Resulta que necesitaba el tiempo de ejecución de VB msvbvm60.dll y, dado que mi caja de desarrollo no lo tiene instalado, no pude registrarlo usando regsvr32

Esa parece ser la respuesta a mi pregunta original por ahora.

user20358
fuente
En mi caso, tuve que eliminar la carpeta obj del proyecto al que intentaba hacer referencia y luego reconstruí el proyecto.
Tolu
7

Asegúrese de que su compilador esté configurado en x86 si está intentando hacer referencia a un dll x86 ...

Tenía problemas similares ... como se mencionó anteriormente, tratando de usar OLEDB para acceder a un archivo de Excel desde mi código C # en Visual Studio 2012.

Seguí recibiendo errores acerca de que la biblioteca de Access no era accesible, pero sabía que la había cargado.

Durante la depuración, me di cuenta de que estaba compilando para 64 bits pero tenía Office x86 cargado. Aunque cargué la biblioteca de Access para 32 bits, la aplicación nunca la estaba usando ... y, por lo tanto, no estaba accesible.

Esto es lo que estaba usando en C #:

"Proveedor = Microsoft.ACE.OLEDB.12.0; Fuente de datos =" + strFilePath + "; Propiedades extendidas = 'Excel 12.0 Xml; HDR = Sí'";

... estaba recibiendo un error

Tan pronto como cambié el compilador a x86, funcionó

Robert Obergfoll
fuente
2

Me acabo de encontrar con ese problema y, después de todas las explicaciones sobre cómo solucionarlo con el símbolo del sistema, descubrí que si lo agrega directamente al proyecto, puede simplemente incluir la biblioteca en cada página que sea necesaria.

JeffB
fuente
2

Tengo el mismo problema al importar WinSCard.dll en mi proyecto. Me ocupo de eso importando directamente desde dll así:

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

Puede agregar esto a un proyecto separado y luego agregar una referencia de su proyecto principal.

Sashus
fuente
1

Tuve este problema después de que mi PC se reiniciara durante la construcción de la solución. Mis dos referencias desaparecieron, así que tuve que reconstruir mis dos proyectos manualmente y luego pude agregar referencias sin errores.

Rafal Cypcer
fuente
1

No puede agregar una referencia a una DLL nativa . Sin embargo, puede incluirlos en la solución (haga clic con el botón derecho en la solución, seleccione "Agregar archivo existente"), pero no se hará referencia a ellos a menos que declare algo como

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

Tal vez haya algún tipo de contenedor DLL, al que en realidad hace referencia y que contiene las importaciones de DLL.

A veces, puede hacer referencia a la DLL contenedora pero aún no puede hacer que su programa se ejecute, donde el mensaje de error le sugiere que se asegure de que el archivo exista y que todas las dependencias estén disponibles.

Este problema se debe a que el ensamblado que está intentando agregar está dirigido y compilado solo para una arquitectura de procesador x86 o x64 .

Simplemente intente cambiar la plataforma de destino a x86 o x64 en Build -> Configuration Manager .

León lobo
fuente
1

Necesitaba cambiar la arquitectura a x86 desde x64 en el administrador de configuración y copiar mi dll de 32 bits (lenguaje C - pcProxAPI.dll) en la nueva carpeta que se creó .. Esto se encuentra en la parte superior de los pasos descritos por "Sashus" a continuación .

C: \ Proyectos .. \ bin \ x86 \ Debug

boateng
fuente
Este también fue un problema para mí.
rogue39nin
pero si el valor predeterminado no es x86 ni x64? pero .... ¿"Any Cpu" apareció ...?
gumuruh
codeproject.com/articles/1160645/… Cualquier cpu puede funcionar también si copia el dll de 32 bits allí
boateng
1

Tuve el mismo problema cuando intenté agregar un dll que acababa de codificar en C ++ a mi nuevo proyecto C #. Resultó que necesitaba establecer las propiedades del proyecto C ++ de donde proviene mi dll:

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

Porque el proyecto de C # en el que quería usar este dll también estaba configurado así (tenía las mismas propiedades configuradas en /clr).

LoukMouk
fuente
Explorador de soluciones> Propiedades> Propiedades de configuración
Yuresh Karunanayake
@gumuruh Si te refieres a "¿qué es clr?", CLR es docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk
0

Enfrenté un problema similar. Estaba tratando de agregar la referencia de un .net 2.0 dll a un proyecto .Net 1.1. Cuando intenté agregar una versión anterior de .dll que se cumplió en .Net 1.1. funcionó para mí.

usuario2623151
fuente
0

Para cualquier otra persona que busque ayuda en este asunto, o experimente una FileNotFoundException o una FirstChanceException, consulte mi respuesta aquí:

Se produjo una excepción de primera oportunidad del tipo 'System.IO.FileNotFoundException' en mscorlib.ni.dll - windows phone

En general, debe estar absolutamente seguro de que cumple con todos los requisitos para hacer la referencia; sé que es la respuesta obvia, pero probablemente esté pasando por alto un requisito relativamente simple.

JHaps
fuente
Examine las diferencias entre las versiones del marco en relación con la referencia; muchas veces, el uso de una versión más reciente del marco no debería marcar la diferencia.
JHaps
0

Tuve este error al escribir un servicio de Windows. Estaba ejecutando Visual Studio como administrador para que mis comandos posteriores a la compilación instalaran automáticamente mi servicio. Me di cuenta de que cuando cerré todo y ejecuté VS normalmente (no como administrador), me permitió agregar las referencias sin ningún error.

Espero que esta solución funcione para ti.

Fütemire
fuente
0

Normalmente, en Visual Studio 2015, debe crear el proyecto dll como un proyecto C ++ -> CLR a partir de las plantillas de Visual Studio, pero técnicamente puede habilitarlo después del hecho:

La propiedad crítica se llama Common Language Runtime Supportset en la configuración de su proyecto. Se encuentra debajo Configuration Properties > General > Common Language Runtime Support.

Al hacer esto, VS probablemente no actualizará la opción 'Target .NET Framework' (como debería). Puede agregar esto manualmente descargando su proyecto, editando el archivo your_project.xxproj y agregando / actualizando la Target .NET framework Versionetiqueta XML.

Para una muestra, sugiero crear una nueva solución como un proyecto CLR de C ++ y examinar el XML allí, tal vez incluso diferenciarlo para asegurarse de que no haya nada muy importante que esté fuera de lo común.

Aaron Hull
fuente
0

Mi respuesta es un poco tardía, pero como prueba rápida, asegúrese de que está utilizando la última versión de las bibliotecas.

En mi caso, después de actualizar una biblioteca nuget que hacía referencia a otra biblioteca que causaba el problema, el problema desapareció.

Martín Staufcik
fuente
0

Puede agregar el archivo .dll manualmente. Por ejemplo, si desea agregar un archivo dll en su aplicación WPF y no puede referirlo en su proyecto

(Obteniendo error: No se pudo agregar una referencia a ".... dll". Asegúrese de que el archivo sea accesible y de que sea un ensamblaje válido o un componente COM),

luego COPIE ese archivo dll y PEGUE en el PROYECTO INSTALADOR (en la carpeta de la aplicación).

ARUN JOHN
fuente
0
  1. inicie cmd.exe y escriba:
  2. Regsvr32% dllpath%
  3. "% dllpath%" reemplace a su ruta dll
charles chen
fuente