Невозможно выполнить сканирование с помощью WIA в Windows 7 x64

Сообщение об ошибке:

Не удалось загрузить файл или сборку «Interop.WIA, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null» или одна из ее зависимостей. Была предпринята попытка загрузить программу с неверным форматом.

Решение отлично работает в Windows XP с обычным usb-сканером, однако при попытке сканирования с помощью сетевого сканера (обнаружено с помощью инструмента Scangear) в Windows 7 (x64) выше встречается.

Код С#:

 private void startscan()
        {

            try
            {

                CommonDialogClass dailog = new CommonDialogClass();
                ImageFile imgfile = (ImageFile)dailog.ShowAcquireImage(WiaDeviceType.ScannerDeviceType, WiaImageIntent.UnspecifiedIntent, WiaImageBias.MaximizeQuality,
                FormatID.wiaFormatJPEG, true, true, false);
                string firstname = DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
                string name = scantxtfname.Text.Trim() + ".jpeg";


                string filenamepath = ConfigurationManager.ConnectionStrings["scanfilepath"].ConnectionString.ToString() + firstname + name;

                scanfile.Add(name);
                firstint.Add(Convert.ToInt32(firstname));
                SaveImageToPNGFile(imgfile, filenamepath);



                FileStream stream = new FileStream(filenamepath, FileMode.Open, FileAccess.Read);

                stream.Close();

                DataTable dt = new DataTable();

                dt.Columns.Add("Scaned Files", typeof(string));

                datagridscanedfiles.DataSource = null;

                for (int i = 0; i < scanfile.Count; i++)
                {
                    DataRow r = dt.NewRow();
                    r[0] = scanfile[i].ToString();
                    dt.Rows.Add(r);
                }
                datagridscanedfiles.DataSource = dt;
                datagridscanedfiles.Visible = true;
                int ln = scanfile.Count;

                pictureBox1.ImageLocation = filenamepath;

            }
            catch ( Exception d)
            {

                MessageBox.Show(d.Message);
            }


        }


 private static void SaveImageToPNGFile(ImageFile image, string fileName)
        {
            try
            {
                ImageProcess imgProcess = new ImageProcess();
                object convertFilter = "Convert";
                string convertFilterID = imgProcess.FilterInfos.get_Item(ref convertFilter).FilterID;
                imgProcess.Filters.Add(convertFilterID, 0);
                SetWIAProperty(imgProcess.Filters[imgProcess.Filters.Count].Properties, "FormatID", WIA.FormatID.wiaFormatJPEG);
                image = imgProcess.Apply(image);
                image.SaveFile(fileName);
            }
            catch (Exception er)
            {

                MessageBox.Show(er.Message);
            }

        }

  private static void SetWIAProperty(IProperties properties, object propName, object propValue)
        {
            Property prop = properties.get_Item(ref propName);

            prop.set_Value(ref propValue);
        }

Пожалуйста, предложите, как я могу решить вышеуказанную проблему?


person Sunil Sambarekar    schedule 17.12.2013    source источник


Ответы (2)


Убедитесь, что вы не строите свой проект как «Любой процессор». Должен быть x86. Компонент WIA COM не может работать в 64-битном режиме.

person G-Man    schedule 17.12.2013

Я когда-либо сталкивался с этой проблемой, и тем более проект не может быть успешно скомпилирован на платформе X64. поскольку компонент WIA COM не может быть вызван в режиме x64, в конце концов я просто обратился к другому способу: завершить свой код WIA в одном приложении, а затем использовать другой процесс для вызова этого приложения сканирования из вашего основного приложения. Я думаю, что это не лучшее решение, но, по крайней мере, оно работает хорошо, ха-ха.

person Scott Yang    schedule 18.12.2013