2009-06-16 25 views
6

Tengo una aplicación Windows Mobile en la que deseo verificar la orientación del dispositivo. Por lo tanto escribí la siguiente propiedad en una de mis formas:Comportamiento extraño con Microsoft.WindowsCE.Forms

internal static Microsoft.WindowsCE.Forms.ScreenOrientation DeviceOriginalOrientation { get; private set; } 

Lo extraño es que después de que cada vez que abro un control de usuario, el diseñador muestra esta advertencia incluso si esa control de usuario no utiliza la propiedad:

No se pudo cargar el archivo o ensamblado 'Microsoft.WindowsCE.Forms, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = 969db8053d3322ac' o una de sus dependencias. La definición del manifiesto del ensamblaje ubicado no coincide con la referencia de ensamblaje. (Excepción de HRESULT: 0x80131040)

Al comentar la propiedad anterior se ignorará la advertencia y se mostrará nuevamente el control del usuario. La aplicación se compila correctamente y se ejecuta sin ningún problema en ambos casos.

¿Alguien sabe por qué sucede esto y cómo puedo solucionarlo?

+0

¿Qué sucede si elimina la palabra clave static? –

+0

El diseñador muestra el mensaje de error. – mrtaikandi

+0

¿Está haciendo referencia a esa versión específica (3.5.0.0) en su aplicación? Podría ser una falta de coincidencia en los números de versión de qué versión asignó en las referencias y qué versión puede encontrar realmente el diseñador. –

Respuesta

4

Este problema me costó un par de horas. Lo resolví agregando Microsoft.WindowsCE.Forms.dll al GAC usando gacutil. Espero eso ayude. Robin

2

Sí, esto es bastante esperado. Como se trata de una propiedad estática (con la que no estoy de acuerdo en primer lugar), el diseñador debe inicializarla, lo que significa cargar Microsoft.WindowsCE.Forms, lo que significa cargar puntos de entrada específicos del dispositivo. Es cierto que el mensaje de error apesta, pero luego el soporte de diseñador para las cosas del dispositivo tiene lots of fun issues que son difíciles de adivinar las causas.

Me gustaría moverlo a otra clase o envolverlo con un cheque para ver si estás en el diseñador. Algo como esto funciona para nosotros:

protected bool IsDesignTime 
{ 
    get 
    { 
     // Determine if this instance is running against .NET Framework 
     // by using the MSCoreLib PublicKeyToken 
     System.Reflection.Assembly mscorlibAssembly = typeof(int).Assembly; 
     if ((mscorlibAssembly != null)) 
     { 
      if (mscorlibAssembly.FullName.ToUpper().EndsWith("B77A5C561934E089")) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
} 
1

Si copia el Microsoft.WindowsCE.Forms.dll a una subcarpeta de su proyecto, por ejemplo, y luego agrega lo siguiente a los eventos de preconstrucción de su proyecto, también funcionará bien si, por ejemplo, . reinstale su PC:

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" /i "$(ProjectDir)SubFolder\Microsoft.WindowsCE.Forms.dll"