2011-12-27 5 views
5

Estoy intentando compilar el proyecto de ejemplo que se muestra here para C#. Tenía que convertirse a VS2010, pero funcionó bien. Se construye, se ejecuta, pero luego muere cuando intenta acceder a una función DLL.Error de tiempo de ejecución de C# DLL: crea, ejecuta pero arroja una excepción no controlada al intentar usar las funciones de DLL

Hice una serie de images para mostrar mis pasos. Como puede ver, el dispositivo que diseñé está conectado y configurado correctamente, pero realmente no creo que tenga nada que ver con el problema. Dentro del archivo Form1.cs, el siguiente comentario explica cómo utilizar la DLL:

/* 
PLEASE NOTE 
You must add a reference to the FTChipIDNet.dll in order to use this sample 
To do this: 
1. Click on Solution explorer tab. 
2. Right click the References tree. 
3. Choose Add Reference option. 
4. Browse to the FTChipIDNet.dll (as a personal preference I place this in my bin directory) 
5. Click OK 
*/ 

he seguido las instrucciones anteriores y la referencia al espacio de nombres definido FTChipID se fijó. También revisé manualmente el buscador de objetos para asegurarme de que la función GetNumDevices existe y lo hace.

Al hacer clic en el botón produce este error:

DLLNotFoundException was unhandled:

Unable to load DLL 'FTChipID.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

en esta línea de código:

FTChipID.ChipID.GetNumDevices(ref numDevices); 

Ahora, usted puede estar pensando "el error dice que necesita FTChipID.dll, no FTChipIDNet. dll ". Me pregunto lo mismo. Tengo FTChipID.dll junto con un archivo .lib y .h, pero no sé cómo usarlos o dónde deben estar para que este programa los pueda encontrar. He intentado añadir una referencia a FTChipID.dll, pero VS2010 dije

A reference to ...\FTChipID.dll could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.

No sé lo que eso significa tampoco. ¿Algunas ideas? Gracias por adelantado.

+0

¿está agregando el .dll como parte de la referencia del proyecto ..? también está consumiendo el espacio de nombres de ese .dll .. también busca en el control de versiones de ese .dll .. o GAC si es necesario si el .dll es un .net 2.0 - 3.5 .dll frente a .net 4.0 .dll también eche un vistazo en la configuración de la propiedad del proyecto, asegúrese de que sea un proyecto 4.0. También intentaré compilarlo como un proyecto 3.5 para ver cuáles son las diferencias. – MethodMan

+0

Agregue FTChipID.dll como salida en su proyecto (o cópielo a la carpeta bin \ Debug) y vuelva a intentarlo. Supongo que FTChipIDNet.dll es un envoltorio para el primero. – rene

+0

Coloque FTChipID.dll en el mismo directorio que FTChipIDNET.dll. El marco debería poder localizarlo entonces. –

Respuesta

2

FTChipIDNet.dll es un contenedor para el FTChipID.dll, por lo que es necesario agregar la referencia a su solución (como lo hizo anteriormente) y luego copiar FTChipID.dll a la carpeta bin allí se ubicará FTChipIDNet.dll.

Ambos dll's deben estar ubicados en la carpeta bin de su solución para funcionar y no deben ubicarse en windows \ system32.

+0

Gracias. Esto al menos produjo un error diferente. Después de agregar FTChipID.dll al proyecto como un elemento existente, VS2010 pudo encontrarlo mientras ejecutaba el depurador. El nuevo error está en el comentario debajo de mi OP. – Anthony

+0

Aquí hay un enlace que podría ayudar con el nuevo mensaje de error. http://stackoverflow.com/questions/2023766/an-attempt-was-made-to-load-a-program-with-an-incorrect-format-even-when-the-p – Leons

+0

Gracias por el enlace. Leer ese enlace me llevó a preguntar a FTDI si lanzaron una versión de 64 bits de FTChipID.dll. ¡En menos de 20 minutos, recibí una respuesta! "Actualmente no ofrecemos una versión de 64 bits de FTChipID.dll. Tenemos usuarios que compilan para una salida de 32 bits y se les dice que funciona bien en sistemas de 32 y 64 bits". Entonces, parece que tengo que usar una versión de 32 bits. VS2010 Express no ofrece eso como una opción, pero averiguaré esa parte. ¡Gracias a todos! – Anthony

0

Parece que hay múltiples .dll de: tanto FTChipIDNet.dll (la que proporcionan la interfaz a), y FTChipID.dll (el uno con el no-COM funcionalidad real,, non-.Net). Necesitas ambos.

SUGERENCIA: Copia tanto a su directorio \ windows \ system32

+0

¿quiere decir que tiene el GAC ambos o copia ambos ...? solo curiosidad por tu respuesta. – MethodMan

+3

Los archivos de aplicación rara vez pertenecen al directorio System32. –

+0

Sí, este pertenece a la carpeta system32, probablemente porque es una parte relacionada de un sistema de controlador. Por favor, guárdelo allí según el diseño original del controlador FTDI. C: \ windows \ System32 \ FTChipID.dll Digo esto porque sus vecinos dlls también están ahí C: \ windows \ System32 \ ftd2xx.dll – hamish

2

Creé el programa de ejemplo FTDI "CSChipID" en VS2013 usando una compilación para "Cualquier CPU". Los dos archivos DLL "FTChipID.dll" y "FTChipIDNet.dll" se copiaron en el directorio bin, pero seguí recibiendo errores cuando se llamó a la primera función DLL, "FTChipID.ChipID.GetNumDevices (ref numDevices);" La solución es cambiar la construcción a "x86" de la siguiente manera.

Build - Configuration Manager Plataforma de solución activa - "x86" Nota: Si "x86" no está disponible, seleccione -Nuevo ...- para seleccionar "x86".

+0

sí, gracias, esta fue la causa de mi problema, tuve una compilación de depuración de mi programa .net. funcionó cuando reconstruí en Visual Studio x86 y Release configuration. Debe ser algún tipo de problema con el compilador de Visual Studio. No es un problema con el dll, porque ya tenía FTchip.dll en mi carpeta c: \ windows \, ​​y ya había estado funcionando antes. – hamish

Cuestiones relacionadas