Динамический тип C # / вопрос по автоматизации Silverlight 4

#c# #silverlight #dynamic #comautomationfactory

#c# #silverlight #динамический #comautomationfactory

Вопрос:

У меня есть эта небольшая функция в моем OOB-приложении Silverlight 4, которая получает изображение со сканера:

 public static BitmapImage GetImageFromScanner()
        {
            try
            {
                using (dynamic CommonDialog = AutomationFactory.CreateObject("WIA.CommonDialog"))
                {
                    //Param meanings: (scanner, black and white, maximize quality)
                    dynamic imageFile = CommonDialog.ShowAcquireImage(1, 2, 131072);
                    if (imageFile != null)
                    {
                        return (BitmapImage)imageFile;
                    }
                }
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {

                if (ex.ErrorCode == -2145320939)
                {
                    MessageBox.Show("Could not find an attached scanner.", "Scanner Error", MessageBoxButton.OK);
                }
                else if (ex.ErrorCode == -2145320957)
                {
                    MessageBox.Show("There is no paper in the scanner.", "Scanner Error", MessageBoxButton.OK);
                }


            }

            return null;
        }
  

Я бы хотел, чтобы функция возвращала растровое изображение, но я не уверен, как привести динамический тип. Я даже не уверен, какого типа был бы файл ImageFile, если бы он не был динамическим. Приведенный выше метод возвращает следующее исключение:

 Unable to cast object of type 'System.Runtime.InteropServices.Automation.AutomationMetaObjectProvider' to type 'System.Windows.Media.Imaging.BitmapImage'.
  

Кто-нибудь может дать рекомендации? Я не уверен, что это вопрос о ключевом слове dynamic или AutomationFactory, поскольку оба они для меня новы. :/

Редактировать:

Я знаю, что это изображение, потому что, если я сделаю это:

  string filePath = string.Format("c:\{0}.jpg", Guid.NewGuid());
                        imageFile.SaveFile(filePath);
                        MessageBox.Show(string.Format("Saved {0}", filePath));
  

Он сохраняет отсканированный документ в формате jpg. Я попытался выяснить, какой объект в .В NET Framework есть метод SaveFile(), и, по-видимому, их много.

Комментарии:

1. Почему бы вам не попробовать GetType () для динамического объекта во время запуска отладчика. Посмотрите, дает ли это вам представление о том, какой объект вы получаете обратно и, следовательно, какого рода изображение, если таковое имеется.

2. GetType() сообщает мне, что это ‘System.Runtime. Службы взаимодействия. Автоматизация. AutomationMetaObjectProvider’

Ответ №1:

Посмотрите, поможет ли это: Сканирование изображения из Silverlight 4 с помощью WIA Automation

Кажется, получить изображение непросто…

Комментарии:

1. Вот ссылка на сообщение, в котором показан код, который я в конечном итоге использовал: brentlamborn.com/post /…

Ответ №2:

ShowAcquireImage возвращает файл изображения, у него есть методы для сохранения содержимого на диск или поток