3

我们开发了一个应用程序来控制和扫描任何文件,如图像等,作为一个 C# Winform 应用程序,它可以在 x86 OS 平台下成功运行。在应用程序中,我们使用 C# twain 类向扫描仪发送命令,这样我们就可以实现我们想要的。众所周知,Twain_32.dll文件用于运行应用程序并进行无故障扫描。

我的问题是,在 x64 操作系统平台上,我们无法运行应用程序并得到一个名为BadImageFormatException的错误,它试图告诉我们这一切都与操作系统类型有关!所以这个错误指出我尝试在不兼容的操作系统类型下运行应用程序。

我已经体验过 32 位 twain dll 在 x64 系统下的工作,但我遇到了另一个问题。我们在一个父表单下运行我们的所有应用程序,即 MDI 父表单。所以我想用作扫描目的的表格将是一个 MDI 客户端表格。好吧,当我的程序编译为ANYCPU时,CLR将在 Windows x64 操作系统中将其作为 x64 位应用程序运行。这就是为什么,即使我在 x64 Win OS 中将我的扫描表单编译为 x86 平台目标,我也无法运行该应用程序。

到这里,我希望你们都明白我的意思!!!

作为解决方案,我尝试安装Twack64安装文件以获取TWAINDSM.dll文件并在 x86 和 x64 操作系统机器上运行我的应用程序。此外,在我的自定义 twain 源项目中,我更改为 dll 导入属性TWAINDSM.dll而不是Twain_32.dll,但它没有成功。

所以我在这里遗漏了什么或者 Twain C# 应用程序无法将TWAINDSM.dll识别为 twain dll?我卡在这一步,不能再往前走了!!!拉我的头发3-4天!!!:(

快速的手将对我有很大的帮助!期待您的回音!!!

4

1 回答 1

0

我们找到了另一种方法,而不是寻找 x64 的 TwainDSM dll,而这在我的公司中实际上是无法找到的。

我已经在 twainforum 上发布了一个关于它的主题,一段时间后我收到了一个答案 - 链接如下:

TwainForum Link 我发布的关于这个问题的帖子!

好吧,当时还不够好找到我的出路。在得到答案之前,我们已经达成协议,我们可以使用 System.Diagnostics.Process 类来解决这个问题,以便根据我们的需要在 x64 平台上工作。我使用的代码如下:

        var proc = new System.Diagnostics.Process();
        String path = "";
        var pathArray = System.Windows.Forms.Application.StartupPath.Split('\\');
        for (int i = 0; i < pathArray.Count() - 1; i++)
        {
            path += pathArray[i] + "\\";
        }
        path = path + "fileName.EXE";
        proc.StartInfo.FileName = path;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.UseShellExecute = false;

        proc.Start();
        string result = proc.StandardOutput.ReadToEnd();
        proc.WaitForExit();
        if (string.IsNullOrEmpty(result))
        {
            MessageBox.Show("No Response from Scanner Screen!", "ERROR!");
            return;
        }

但是如何从该 exe 传递参数以在我的项目中使用它?有办法做到这一点!只需在 FileName.Exe 的 Program.cs 文件中放一行代码,如下所示:(我还放了一条垂直线来分隔参数)

Console.Write(FilePathAndName + "|" + PicFormArsivOK.ToString() + "|" + TarayiciFormArsivOK.ToString());

最后我从结果值中读取值,如下所示:

 if (result.Split('|').First() != "" && (Convert.ToBoolean(result.Split('|')[1]) == true | Convert.ToBoolean(result.Split('|')[2]) == true))
        {
          //TODO:  
        }

我希望您在这里得到了想法,并且答案对您的需求有用!

于 2015-06-04T14:02:52.897 回答