Question

J'ai un projet .NET qui a toujours été construit / exécuté par / sur des machines 32 bits. J'ai un nouvel ordinateur 64 bits et j'essaie de le faire fonctionner. Le script de construction est en cours, et à un moment donné, nous compilons du code boo en utilisant la tâche nant. Le code boo fait référence à notre DLL principale, qui est créée à partir de la source c # plus tôt dans le processus de construction.

J'ai essayé deux choses: construisez-le en mode 32 bits et construisez-le en mode 64 bits. En utilisant les corflags sur plusieurs programmes (y compris booc), j'ai pu construire le projet construit en mode 32 bits, mais je me suis retrouvé avec un tas de problèmes en aval au moment de l'exécution. Il me faut donc le construire en mode 64 bits, ce qui, à mon avis, est préférable quand même.

Selon le code source de nant / booc, la tâche groupante appelle le processus in-process de booc.exe à l'aide de la classe Process du CLR. Par conséquent, je pense qu'elle devrait hériter des processus 32 bits ou 64 bits du processus parent. Cela ne reflète pas ce que je vois, cependant.

Voici ce que j'ai fait:

  1. A utilisé la version 64 bits de powershell pour appeler nant
  2. Plate-forme spécifiée = " x64 " sur mes tâches. Je pense que je ne devrais pas être obligé de faire cela car anycpu devrait aller, mais cela semble faire la différence.

Voici l'erreur que je reçois:

[booc] Compiling 5 files to 'C:\dev\build\MyProjectBoo.dll'.
[booc] BCE0106: Failed to access the types defined in assembly 'MyProject, Version=5.5.0.0, Culture=neutral, PublicKeyToken=null' - (C:\dev\build\MyProject.dll):Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
[booc]  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc]  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc] .
[booc] 1 error(s).

Ce qui signifie que, selon le code source booc, "j'ai essayé de répertorier de manière réfléchie les types dans votre assemblage référencé mais j'ai échoué". Je ne sais pas si cela signifie, "Je pense que je suis 32 bits, mais ce sont des dll 64 bits" ou quoi, et je suis très confus.

Avez-vous des idées sur la manière de faire fonctionner cela?

Mettre à jour après quelques travaux, j'ai découvert que le problème n'avait rien à voir avec boo. J'ai écrit un programme rapide c # qui charge de manière réflexive la DLL et il se casse de la même manière. Donc, pour une raison quelconque, peu importe ce que je définis comme plate-forme (x86, x64 ou anycpu), je ne peux pas le charger de manière réfléchie sur une machine x64. Donc pas vraiment la faute de boo. Je vais donc creuser cela et republier si j'ai une meilleure question.

Mise à jour plus récente Il s'avère que l'une des dépendances tierces de ma DLL principale insiste pour être dans un environnement 32 bits, même si celui-ci n'est pas construit avec corflags. Cela provoque l'assembly.GetTypes () en mode 64 bits.

Était-ce utile?

La solution

Le problème est lié aux dépendances de DLL tierces nécessitant le mode 32 bits, ce qui est possible même si aucune corflags n'est définie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top