33

Escribo un complemento para otro programa que se basa en una API .NET pública. Normalmente, estos complementos se crean mediante la creación de una biblioteca de clase DLL que hace referencia al ensamblado API. A continuación, se crea una clase de comando heredando desde una clase de comando base en el conjunto de API. La aplicación se configura para hacer referencia al archivo DLL del complemento y también es responsable de activar realmente la clase de comando personalizada cuando el usuario lo solicita.System.BadImageFormatException Se intentó cargar un programa con un formato incorrecto

Sin embargo, ahora intento automatizar la generación de código a través del System.CodeDOM, y quiero crear una aplicación de consola simple que genere automáticamente nuevos tipos de clase basados ​​en tipos en el ensamblado API.

Sin embargo, cuando intento ejecutar mi aplicación obtengo la siguiente excepción.

System.BadImageFormatException era mensaje no controlada: No se pudo cargar el archivo o ensamblado 'RevitAPI, versión = 2011.0.0.0, Culture = neutral, PublicKeyToken = null' o uno de sus dependencias . Se intentó cargar un programa con un formato incorrecto .

Normalmente necesito establecer el marco de destino de un ensamblaje de complemento en 3.5. Sin embargo, ahora descubrí que el error anterior desaparece si establezco el marco de destino de mi aplicación de consola en 2.0. Sin embargo, mi aplicación de consola ya hace referencia a otras bibliotecas de clase que tienen su marco de destino establecido en 3.5. Y preferiría no reescribirlos en el marco 2.0.

+1

pienso, ha llegado el momento de marcar la respuesta de Simon como aceptada, ¿o no es la correcta? –

Respuesta

45

Posiblemente una discrepancia de 32 - 64 bits.

Si está ejecutando en un sistema operativo de 64 bits, el Assembly RevitAPI puede compilarse como 32 bits y su proceso como 64 bits o "Cualquier CPU".

O bien, RevitAPI se compila como de 64 bits y su proceso se compila como de 32 bits o "Cualquier CPU" y se ejecuta en un sistema operativo de 32 bits.

+0

Estoy ejecutando Windows XP x64, todos mis otros proyectos tienen su plataforma establecida en "Cualquier CPU", pero la aplicación de la consola tenía su plataforma configurada en "x86". Cambié esto a "Cualquier CPU", y ahora obtengo la excepción - - -FileNotFoundException no fue manejada: no se pudo encontrar el módulo especificado. (Excepción de HRESULT: 0x8007007E). Sin embargo, no veo ningún detalle con respecto a qué archivo o módulo no se encontró. –

+0

¿Has comprobado cómo se compila RevitAPI? –

+1

Ehh lo siento, soy nuevo en esto, ¿dónde lo compruebo? –

36

Si utiliza IIS, Ir al grupo de aplicaciones Seleccione el que utiliza su sitio y haga clic en Configuración avanzada Asegúrese de que el permitir que las aplicaciones de 32-bit se pone a True

11

que estaba teniendo problemas con una nueva instalación de VS con un proyecto x64 - para Visual Studio 2013 y Visual Studio 2015:

Tools 
    -> Options 
    -> Projects and Solutions 
    -> Web Projects 
    -> Check "Use the 64 bit version of IIS Express for web sites and projects" 
+1

+ 1.trabajaba en VS2015 para un proyecto de MVC que hacía referencia a una DLL. Intenté configurar la configuración en x64, incluso vinculé a una versión más nueva del ensamblado sin ningún resultado. Esta es la solución que finalmente funcionó – raghav710

0

que tenían el mismo problema cuando recibo mi software que se ejecuta en otra máquina. En mi PC desarrollador (Windows 7), tuve instalado Visual Studio 2015, la PC de destino era una instalación limpia de Windows 10 (.Net instalado). También lo probé en otra PC limpia de Windows 7, incluido .Net Framework. Sin embargo, en las dos pc de destino necesitaba instalar el paquete Visual C++ Redistributable for Visual Studio 2015 para x86 o x64 (depende de para qué se construye la aplicación). Eso ya estaba instalado en mi pc para desarrolladores.

Mi aplicación utilizaba una biblioteca C, que se compiló a una aplicación C++ utilizando las opciones/clr y/TP en el estudio visual. Además, la aplicación proporcionaba funciones a C# mediante el uso de firmas de métodos dllexport. No estoy seguro de si la integración de C# dio lugar a ese error o si una aplicación C++ me hubiera dado lo mismo.

Espero que ayude a cualquiera.

0

Estas sugerencias son precisas, pero quería agregar una nota. Me quedé atrapado simplemente porque tenía múltiples configuraciones de publicación. Estaba editando "Depurar - Cualquier CPU" y luego implementé la configuración "Depurar - x64". Asegúrese de editar y desplegar la misma configuración. Verifique esto haciendo clic en la pestaña "Configuración" después de comenzar a publicar y aparecerá el cuadro de diálogo "Publicar web". Asegúrese de que coincida con la configuración que ha editado. (Eso es de 4 horas de mi vida que nunca se pondrá en contacto!)

-1

he mismo problema lo que hice i acaba de descargar DLL de 32 bits y añadido a mi carpeta bin esto se soluciona mi problema

Cuestiones relacionadas