Странное поведение с Microsoft.WindowsCE.Forms - PullRequest
6 голосов
/ 16 июня 2009

У меня есть приложение для Windows Mobile, в котором я хочу проверить ориентацию устройства. Поэтому я написал следующее свойство в одной из моих форм:

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

Странно то, что после этого всякий раз, когда я открываю UserControl, дизайнер показывает это предупреждение, даже если этот UserControl не использует свойство:

Не удалось загрузить файл или сборку 'Microsoft.WindowsCE.Forms, версия = 3.5.0.0, культура = нейтральная, PublicKeyToken = 969db8053d3322ac' или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Комментируя вышеуказанное свойство, вы увидите предупреждение и снова увидите пользовательский элемент управления. Приложение успешно собрано и в обоих случаях работает без проблем.

Кто-нибудь знает, почему это происходит и как я могу это исправить?

Ответы [ 3 ]

4 голосов
/ 02 февраля 2010

Эта проблема стоила мне пару часов. Я решил это, добавив Microsoft.WindowsCE.Forms.dll в GAC, используя gacutil. Надеюсь, поможет. Robin

2 голосов
/ 16 июня 2009

Да, это довольно ожидаемо. Так как это статическое свойство (с которым я бы не согласился в первую очередь), дизайнер должен его инициализировать, что означает загрузку Microsoft.WindowsCE.Forms, что означает загрузку точек входа, специфичных для устройства. Следует признать, что сообщение об ошибке - отстой, но поддержка дизайнеров для устройств имеет множество забавных проблем , которые трудно угадать.

Я бы попробовал переместить его в другой класс или обернуть его проверкой, чтобы убедиться, что вы дизайнер. Как-то так у нас работает:

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 голос
/ 08 июня 2010

Если вы скопируете Microsoft.WindowsCE.Forms.dll, например, в подпапку вашего проекта, а затем добавите следующее к событиям предварительной сборки вашего проекта, это также будет нормально работать, если вы, например. переустановите компьютер:

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