33

J'écris un plug-in pour un autre programme basé sur une API .NET publique. Généralement, ces plugins sont créés en créant une DLL de bibliothèque de classes faisant référence à l'assembly API. Une classe de commande est ensuite créée en héritant d'une classe de commande de base dans l'assembly API. L'application est ensuite définie pour référencer le fichier DLL de plug-in, et est également responsable de la mise à feu de la classe de commande personnalisée lorsque l'utilisateur le demande.System.BadImageFormatException Tentative de chargement d'un programme avec un format incorrect

Cependant, maintenant j'essaye d'automatiser la génération de code par System.CodeDOM, et je veux créer une application de console simple qui génère automatiquement de nouveaux types de classe basés sur des types avec dans l'assemblée d'API.

Pourtant, lorsque j'essaie d'exécuter mon application, je reçois l'exception suivante.

System.BadImageFormatException était unhandled Message: Impossible de charger le fichier ou l'assembly 'RevitAPI, Version = 2011.0.0.0, Culture = neutral, PublicKeyToken = null' ou une de ses dépendances . Une tentative a été effectuée pour charger un programme avec un format incorrect .

Habituellement, j'ai besoin de définir la structure cible d'un assemblage de plug-in à 3.5. Pourtant maintenant j'ai trouvé que l'erreur ci-dessus disparaît si je place le cadre cible de mon application de console à 2.0. Toutefois, mon application de console référence déjà d'autres bibliothèques de classes de miennes dont l'infrastructure cible est définie sur 3.5. Et je préfère vraiment ne pas les réécrire autour du framework 2.0.

+1

Je pense, le temps est venu de marquer la réponse de Simon comme acceptée ou n'est-ce pas la bonne? –

Répondre

45

Il s'agit probablement d'une discordance de 32 à 64 bits.

Si vous utilisez un système d'exploitation 64 bits, l'assembly RevitAPI peut être compilé en 32 bits et votre processus en 64 bits ou "Any CPU".

Ou bien, le RevitAPI est compilé en 64 bits et votre processus est compilé en 32 bits ou «Any CPU» et s'exécute sur un système d'exploitation 32 bits.

+0

Je suis sous Windows XP x64, tous mes autres projets ont leur plate-forme définie sur "Any CPU", mais l'application de la console avait sa plate-forme définie sur "x86". Je change cela à "Any CPU", un maintenant obtenir l'exception - - -FileNotFoundException n'a pas été gérée: Le module spécifié n'a pas pu être trouvé. (Exception de HRESULT: 0x8007007E). Pourtant, je ne vois pas de détails sur ce que le fichier ou le module ce qui n'a pas trouvé. –

+0

Avez-vous vérifié comment le RevitAPI est compilé? –

+1

Ehh désolé je suis nouveau à cela, où puis-je vérifier cela? –

36

Si vous utilisez IIS, Aller au pool d'applications Choisissez celui que votre site utilise et cliquez sur Paramètres avancés Assurez-vous que la fonction Activer les applications 32 bits est définie sur True

11

J'avais des problèmes avec une nouvelle installation de VS avec un projet x64 - pour Visual studio 2013 et 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. a travaillé pour moi dans VS2015 pour un projet MVC référençant une DLL. J'ai essayé de mettre la configuration à x64, même liée à une version plus récente de l'assemblée en vain. C'est la solution qui a finalement fonctionné – raghav710

0

J'ai eu le même problème lors de l'obtention de mon logiciel en cours d'exécution sur une autre machine. Sur mon PC de développement (Windows 7), j'avais Visual Studio 2015 installé, le PC cible était une installation propre de Windows 10 (.Net installé). J'ai également testé sur un autre PC Windows 7 propre, y compris .Net Framework. Cependant, sur les deux PCs cibles j'ai dû installer le paquet Visual C++ Redistributable for Visual Studio 2015 pour x86 ou x64 (dépend de ce que votre application est construite). C'était déjà installé sur mon pc de développeur.

Mon application utilisait une bibliothèque C, qui a été compilée dans une application C++ en utilisant les options/clr et/TP dans visual studio. L'application fournissait également des fonctions à C# en utilisant des signatures de méthodes dllexport. Je ne sais pas si l'intégration C# conduit à me donner cette erreur ou si une application C++ m'aurait donné la même chose.

Espérons que cela aide tout le monde.

0

Ces suggestions sont précises, mais je voulais ajouter une note. J'étais bloqué simplement parce que j'avais plusieurs configurations de publication. J'étais en train d'éditer le "Debug - Any CPU" et ensuite de déployer la configuration "Debug - x64". Assurez-vous que vous modifiez et déployez la même configuration. Vérifiez cela en cliquant sur l'onglet "Paramètres" après avoir commencé la publication et la boîte de dialogue "Publier le Web" apparaît. Assurez-vous qu'il correspond à la configuration que vous avez modifiée. (C'est 4 heures de ma vie, je ne récupèrera jamais!)

-1

j'ai même problème ce que je je l'ai fait juste téléchargé dll 32 bits et ajouté à mon dossier bin ceci est résolu mon problème