Pregunta

Tengo un proyecto .NET que siempre ha sido construido / ejecutado por / en máquinas de 32 bits. Tengo una nueva computadora de 64 bits y estoy tratando de abordar la tarea de hacer que funcione allí. El script de compilación está en nant, y en un momento compilamos un código boo usando la tarea nant. El código boo hace referencia a nuestra DLL central, que se crea a partir de la fuente c # anteriormente en el proceso de construcción.

He intentado dos cosas: compilarlo para ejecutarse en modo de 32 bits y compilarlo para ejecutarlo en modo de 64 bits. Al usar corflags en varios programas (incluido booc), pude construir el proyecto en modo de 32 bits, pero terminé con un montón de problemas posteriores en tiempo de ejecución. Así que necesito hacerlo integrado en modo de 64 bits, lo que creo que es preferible de todos modos.

Según el código fuente nant / booc, la tarea booc nant llama al proceso booc.exe en proceso usando la clase Process de CLR, por lo que (creo) debería heredar 32 bits o 64 bits del proceso padre. Sin embargo, eso no refleja lo que estoy viendo.

Esto es lo que he hecho:

  1. Usó la versión de 64 bits de powershell para invocar nant
  2. Plataforma especificada = " x64 " en mis tareas Siento que no debería tener que hacer esto porque anycpu debería estar bien, pero parece hacer la diferencia.

Aquí está el error que estoy recibiendo:

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

Lo que significa que, de acuerdo con el código fuente de booc, "Intenté enumerar reflexivamente los tipos en su ensamblado referenciado pero fallé". No sé si eso significa "Creo que tengo 32 bits, pero estos son dlls de 64 bits". o qué, y estoy muy confundido.

¿Alguna idea sobre cómo puedo hacer que esto funcione?

Actualizar después de algún trabajo, he descubierto que el problema no tiene nada que ver con el abucheo. Escribí un programa c # rápido que carga de manera reflexiva la dll y se rompe de la misma manera. Entonces, por alguna razón, no importa lo que configuré como plataforma (x86, x64 o anycpu), no puedo cargarlo reflexivamente en una máquina x64. Así que no es realmente culpa de Boo. Así que voy a profundizar en esto y volver a publicar si tengo una pregunta mejor.

Actualización más reciente Resulta que una de las dependencias de terceros de mi DLL principal insiste en estar en un entorno de 32 bits, a pesar de que no está construido con corflags. Esto causa el ensamblado. GetTypes () falla en el modo de 64 bits.

¿Fue útil?

Solución

El problema son las dependencias de las DLL de terceros que requieren el modo de 32 bits, lo cual es posible incluso si no tienen configurados corflags.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top