2013-06-20 4 views
0

У меня есть приложение WPF .Net 4.0, которое до недавнего времени работало отлично под WinPE 4.0. Я добавил код, показанный ниже, и он сломал приложение при запуске под WinPE 4.0. Обратите внимание, что приложение все еще прекрасно работает под Windows 7 x64 и Windows, 2012.Почему я получаю это исключение в WinPE 4.0, но не Windows 7/Windows 2012?

[ValueConversion(typeof(string), typeof(bool))] 
public class HeaderToImageConverter : IValueConverter 
{ 
    public static HeaderToImageConverter Instance = 
     new HeaderToImageConverter(); 

    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if ((value as string).Contains("corp.com")) 
     { 
      Uri uri = new Uri 
      ("pack://application:,,,/Images/DeployWiz_Network.png"); 
      BitmapImage source = new BitmapImage(); 
      source.BeginInit(); 
      source.UriSource = uri; 
      source.DecodePixelHeight = 40; 
      source.EndInit(); 
      return source; 
     } 
     else 
     { 
      Uri uri = new Uri 
      ("pack://application:,,,/Images/ou2.png"); 
      BitmapImage source = new BitmapImage(); 
      source.BeginInit(); 
      source.UriSource = uri; 
      source.DecodePixelHeight = 20; 
      source.EndInit(); 
      return source; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException("Cannot convert back"); 
    } 
} 

Этот код позволяет мне использовать другое изображение в моем контроле Treeview на основе содержимого элемента TreeView.

При выполнении этого под WinPE, я получаю следующее исключение:

enter image description here

Итак, я поставил недостающие .DLL в той же папке, как мой EXE-файл, а затем я получаю это исключение:

enter image description here

есть ли что-то в стиле фанк о .dll, который не вызывает его на работу в WinPE? Есть ли какой-либо другой класс, который я могу использовать помимо BitmapImage в WPF для достижения моих целей и избежать этого .dll? Является ли BitmapImage даже классом, который нуждается в этом .dll? Я предполагаю, что это потому, что это единственный новый код, который я добавил, который разбивает мое приложение.

ответ

2

Вы используете 32-битную или 64-разрядную среду WinPE?

По внешнему виду ваше приложение WPF использует платформу «Любой процессор», поэтому при запуске приложения ожидается, что 32-битная версия mscms.dll будет доступна при работе на 32-битной платформе и 64-битной mscms.dll при работе на 64-битной платформе.

Вам необходимо убедиться, что вы скопировали файл mscms.dll, который соответствует среде «битности» WinPE, которую вы решили использовать.

WinPE x64 не поддерживает WOW64 (Windows 32-bit в Windows 64-bit) ... поэтому компиляция вашего приложения как «x86» (т. Е. 32 бит) и поставка 32-битного mscms.dll не является вариантом.

Таким образом, убедитесь, что вы скопировать правильный 32-битный или 64-битный mscms.dll ... в зависимости от вашего PE разрядности.

Вы «может» быть в состоянии добавить WOW64 (Windows 32-бит на Windows, 64-разрядная версия) для WinPE x64, создавая собственные пользовательские PE сборки/изображение, следуя некоторые предложения здесь:

+0

Я скопировал mscms.dll из моего C: \ Windows \ system32 в ту же папку, что и мой EXE-файл, и это не сработало. Итак, я скопировал файл mscms.dll из своей папки c: \ windows \ syswow64 в ту же папку, что и мой .exe, и он все еще не работает. Что еще я могу попробовать? Я использую 64-разрядную WinPE. – Dbloom

+1

Вам нужно проверить, какие каталоги исследуются при попытке загрузить mscms.dll, возможно, это не обязательно будет выглядеть в вашем каталоге приложений. Вы можете использовать Fusion Log Viewer для просмотра любых сбоев и почему: http://msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx ... http: //blogs.msdn .com/б/suzcook/архив/2003/05/29/57120.aspx –

0

Ну, после более детективной работы проблема в том, что класс BitmapImage в C# в конечном итоге сводится к 32-разрядному родному .DLL, который НЕ будет работать в 64-разрядной WinPE.

Я подтвердил это, запустив мое приложение в 32-разрядной WinPE просто отлично. Итак, кто-нибудь знает какой-либо другой способ визуализации изображений в WPF, кроме класса BitmapImage?

:-)