2010-09-20 10 views
10

Puedo hacer referencia al código de Matlab desde un proyecto basado en x86, pero no desde un proyecto x64.¿Cómo compilo una biblioteca de servicios WCF en modo de 32 bits?

Puedo construir el Servicio WCF como "Cualquier CPU", pero no como x86. Cuando se intenta generar, ya que sólo 86, da el siguiente error:

---start error--- 
System.BadImageFormatException: Could not load file or assembly 'file:///D:\backtest\WcfServiceLibrary.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format. 
---end error--- 

Por lo tanto, estoy atascado: ¿cómo diablos puedo proporcionar Matlab llama a través de WCF? Es como una forma extraña de desarrolladores XOR.

¿Alguna idea sobre cómo (a) compilar la biblioteca de servicios WCF en el modo de 32 bits, o (b) solucionar el problema?

tengo Win7 x64, MSVS 2010.

+1

Por defecto, 'WcfSvcHost.exe' es de 64 bits, por lo que sólo se ejecuta 64- ensamblados de bits y arrojarán errores con ensamblajes de 32 bits. Si puede evitar el alojamiento utilizando 'WcfSvcHost.exe', entonces evitará los errores asociados con el intento de utilizar ensamblajes de 32 bits. Hay formas de alojar un servicio WCF que evita 'WcfSvcHost.exe', que resuelve el problema original. – Contango

Respuesta

9

WcfServiceLibrary es una DLL, por lo que debe construirse como "Cualquier CPU". Solo los proyectos EXE que alojan todas las otras DLL deben marcarse como "x86" o "x64" según sea necesario. ¿Qué proyecto es el EXE en este caso?

+0

El cliente es el EXE. El EXE llama a las funciones del servicio web WCF, el servicio WCF llama a las funciones de Matlab a su vez. Entiendo que las DLL deben estar marcadas como "Cualquier CPU", pero si hago esto, no puedo crear una instancia de la clase Matlab para llamar a la funcionalidad de Matlab ya que da un error. – Contango

+0

Presumiblemente, el cliente está utilizando un proxy para el servicio WCF. Entonces, ¿qué es lo que aloja el servicio WCF: IIS, una aplicación de consola o un servicio de Windows? –

+0

Problema resuelto. Gracias por ponerme en el camino correcto.Ver: http://stackoverflow.com/questions/3755761/i-cant-compile-a-standard-wcf-service-library-in-x86-format. Tenía una solución con dos proyectos: un proyecto era una aplicación de consola que consumía servicios de la Biblioteca de servicios de WCF, y un proyecto era la Biblioteca de servicios de WCF. Cuando ejecuté la aplicación de la consola, ejecutó automáticamente el servicio, alojado con "WcfSvcHost". He demostrado que si alojo mi biblioteca de servicios WCF de 32 bits con un método diferente, a saber, IIS, no lanzará ninguna excepción solo porque está compilada en modo de 32 bits. – Contango

24

Su problema es realmente el WCF Test Client quejándose de que su Biblioteca de servicios WCF es de 32 bits. Esto se debe a que, por defecto, WCF Test Client siempre se ejecuta en modo de 64 bits.

Encontré los siguientes pasos en este blog que hace que el WCF Test Client se ejecute en modo de 32 bits y, por lo tanto, no verá el error que ha publicado.

  1. Copia WcfSvcHost.exe y WcfTestClient.exe de C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE a un directorio local. Mantenga una copia de seguridad de este archivo, por supuesto.
  2. Iniciar un Studio 2010 Visual Prompt de Comando (uno de los enlaces en el menú de inicio -> Visaul Studio 2010)
  3. "cd" al directorio donde se encuentra la copia de WcfSvcHost.

  4. Ejecutar el comando "corflags/32BIT +/FUERZA WcfSvcHost.exe"

  5. Ejecutar el comando "corflags/32BIT +/FUERZA WcfTestClient.exe"

  6. Copiar los archivos de nuevo a donde lo encontraste .

Ahora su WcfSvcHost y WcfTestClient va a correr en modo de 32 bits, y usted no conseguirá su error

+0

Relacionados [artículo con pantallas] (http: //coding.abel. nu/2012/04/debugging-a-wcf-service-using-a-32-bit-dll /) dice cómo preservar .exe original y cómo configurar VS para usar copias de 32 bits de las aplicaciones Host y Client. – quetzalcoatl

+0

Debe tener en cuenta que, dado que sigue estos pasos, 'WcfSvcHost' y' WcfTestClient' siempre se ejecutarán en x86. – Diego

Cuestiones relacionadas