2009-07-21 19 views
12

Actualmente estamos probando Mono para ver si nuestras DLL .NET funcionarán para los clientes en Linux. Nuestros archivos DLL proporcionan componentes para Windows Forms. Coloqué los archivos DLL en el directorio Debug, agregué las referencias y creé una clase derivada de un Windows Form. La clase había funcionado bien independiente, pero después he añadido las referencias DLL y ha creado uno de nuestros componentes (el intellisense funcionaba bien), que compila pero no se ejecutará:¿Cómo usar DLL de ensamblado .NET precompilado en Mono?

 
** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 
File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' 

Miré a las propiedades de la asamblea, y es esa versión con esa clave pública.

¿Hay alguna manera de utilizar estos archivos DLL? ¿Qué estoy haciendo mal?

EDIT:

Según el MoMA, aparte de algunos s [MonoTodo] que no tienen ninguna relación con la situación, hay un problema en tres de las DLL:

 
Calling Method | P/Invoke Method | P/Invoke Library 
void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll 

Sin embargo, he abierto uno de nuestros proyectos de ejemplo creados con VS2008, apuntó la referencia a la DLL en el lugar correcto, y funcionó bien. Pero no pude obtener la referencia para trabajar en un nuevo proyecto. ¿Estoy haciendo algo mal?

EDIT 2: Para aclarar, no queremos volver a crear una aplicación de Windows existente: simulamos que un cliente está creando una nueva aplicación con nuestro dll. Estaba probando eso para ver si era un problema de dll. Dado que la aplicación VS-made fue capaz de encontrar el dll y ejecutar con éxito, parece que no es un problema de DLL. La nueva aplicación no llama a nada de lo que no hace la aplicación creada por VS.

Respuesta

9

Probando la DLL con MOMA (Mono Migration Analyzer) para ver si está usando API no compatibles.

+0

Acabo de agregar los detalles de MoMA arriba. Sin embargo, funciona bien con la aplicación de muestra. Simplemente no con la nueva aplicación creada con MonoDevelop. – NickAldwin

+0

No necesita (no debería) volver a crear la aplicación en MonoDevelop. Mono debería ser capaz de ejecutar DLL compilados en Visual Studio. Me gustaría ver esa llamada ComboBoxControl.SetWindowsTheme - que está haciendo la llamada p/invoke, lo que significa que no será compatible con Mono. ¿Puedes eliminarlo o no usar ese control? –

+0

No queremos recrearlo: simulamos que un cliente está creando una nueva aplicación con nuestro dll. Estaba probando eso para ver si era un problema de dll. Dado que la aplicación VS-made fue capaz de encontrar el dll y ejecutar con éxito, parece que no es un problema de DLL. La nueva aplicación no llama a nada de lo que no hace la aplicación creada por VS. – NickAldwin

4

En general, usted puede obtener más detalles sobre los errores de carga .dll mediante la ejecución con:

MONO_LOG_LEVEL = "depuración" MONO_LOG_MASK = "dll" mono myapp.exe

+0

Gracias por la respuesta, pero después de establecer esas variables de entorno mono aún no me dio más información. – NickAldwin

6

lo que Jonathan dicho es correcto, es necesario ejecute el comando como se muestra y producirá grandes cantidades de información.

El conjunto tiene un nombre fuerte, por lo que parece que en Windows tiene una dependencia que está instalada en el GAC. Si "OUR.ASSEMBLY" se supone que es allí, ejecute:

gacutil -i OUR.ASSEMBLY.dll

para instalarlo. Puede haber otras dependencias que necesita OUR.ASSEMBLY.dll, que es lo que el comando JPobst 'mostraría.

+0

No usamos el GAC, sin embargo. – NickAldwin

+2

Claro, pero usted nombró fuertemente a ese ensamblaje, por lo que Mono lo buscará en el GAC. Puede anular esto con "exportar MONO_PATH = DIR" para fines de diagnóstico (ordenará que Mono busque el ensamblaje en DIR, independientemente de su nombre). –

4

Los posibles problemas son que el ensamblaje no se coloca en el mismo directorio que el programa o que la mayúscula y minúscula del nombre del archivo de ensamblaje no se conserva cuando se copió. Por ejemplo, es posible que tenga una referencia NUESTRO.ASENTEMENTE, pero el nombre del archivo es OurAssembly.DLL o cualquier otra combinación de caso no válida que las personas puedan encontrar.

+0

Me aseguré de que estuviera en el mismo directorio y en el mismo caso, y aún así se produjo el error. – NickAldwin

+0

Si no desea publicar el registro de salida para configurar los archivos env, es posible que desee probar y ejecutar mono bajo strace: strace -f -e abra mono yourtest.exe y vea qué archivo está intentando carga y dónde. – lupus

1

uxtheme.dll es el motor de temas de Windows, si no me equivoco. Es bastante natural que no tenga eso en un entorno que no sea de Windows, por lo que P/Invocar sus funciones exportadas no es directamente posible.

Usted tiene dos opciones aquí:

  1. abrir ese OnHandleCreated método y reemplazar la llamada SetWindowTheme con algo portátil o
  2. Crear un maniquí libuxtheme.so que contiene sólo esta función de modo mono puede P/Invóquelo .

Recomiendo el primer acercamiento si es posible, ya que necesitaría crear ese dummy libuxtheme.so para cada plataforma que esté soportando. Es decir, tendrías que hacer un libuxtheme.so para x86 Linux, un libuxtheme.so para x86_64 Linux, lo mismo para FreeBSD, un libuxtheme.dylib para Mac OS X y más.

Si OnHandleCreated fue generado por algún diseñador de UI o similar, probablemente tenga que eliminar algunos temas de widgets para deshacerse de la llamada.

Cuestiones relacionadas