2

让我对我的场景进行一个完整的解释:

我们需要在我们的应用程序中使用签名板,该应用程序是在 Silverlight 5 中开发的,在浏览器外模式下,具有更高的信任度,问题始于设备制造商不提供任何类型的 API 的事实或用于 Silverlight 的 SDK,它们的 .NET 程序集实际上是用于 WinForms 应用程序的,但通过将控件放在WindowsFormHost中,它仍然可以在 WPF 中使用。

我一直在寻找选项,到目前为止,我们有 2 个备选方案,这两个备选方案都涉及创建一个小型 WPF 应用程序来使用控件并在那里捕获签名,从 Silverlight 调用它:

  1. 创建一个“侦听器”,检查将签名保存为图像的文件夹并将其发送到 silverlight 应用程序。
  2. 让 Silverlight 应用程序自己获取文件,用户必须为此单击一个按钮。

我宁愿通过从 WPF 应用程序本身检索结果来做到这一点,我尝试使用 COM 来做到这一点,但做不到。

我可以一次做其中一件事情(启动或从另一个程序集获取结果),但不能同时做。

我按照这篇文章在 Silverlight 中使用 COM,这篇文章给程序集起一个强名称,以及使用 COM 互操作性启动另一个应用程序

WPF 应用程序按照上面链接中的描述启动(使用 WScript.Shell Run 方法),我在同一个 .exe 文件中有以下类

namespace WpfSignatureCapture
{
  [ProgId("WpfSignatureCapture")]
  [ClassInterface(ClassInterfaceType.AutoDual)]
  static public class ImageExport
  {
    private static byte[] image;
    public static byte[] Image { get; set; }

    [ComVisible(true)]
    public static byte[] ImageAsByteArray()
    {
        return image;
    }
  }
}

作为参考,在捕获签名后,用户应该单击一个按钮将其保存为图像,执行下一个方法:

    private void SaveToImage_Click(object sender, RoutedEventArgs e)
    {
        var img = sigPlusNET.GetSigImage();
        var ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        byte[] array = ms.ToArray();

        ImageExport.Image = array;
    }

当我尝试从仍在运行的 WPF 应用程序中获取该字节数组时,即使我签署并注册了 WPF 应用程序的 exe,似乎也无法找到 ProgId。

这就是我试图得到它的方式:

    private void GetSignatureClick(object sender, RoutedEventArgs e)
    {
        byte[] image;

        if (Application.Current.HasElevatedPermissions && AutomationFactory.IsAvailable)
        {
            dynamic getImage = AutomationFactory.GetObject("WpfSignatureCapture");

            image = getImage.ImageAsByteArray();
            var file = new FileStream(@"C:\signature.bmp", FileMode.Create);
            file.Write(image, 0, image.Length);
            file.Flush();
            file.Close();
        }
    }

这是我得到的错误:

在此处输入图像描述

所以我有三个问题:

  1. 我正在尝试做的事情可能吗?
  2. 我应该采取什么方法才能使它起作用?
  3. 有没有其他更简单/更有效的方法来做到这一点?如果是这样,如何?
4

1 回答 1

1

在 Silverlight 应用程序之间,我建议使用本地进程间通信 - 请参阅http://msdn.microsoft.com/en-us/library/dd833063%28v=VS.95%29.aspx - 但它可能不起作用在 Silverlight 和 WPF 之间。

因此,剩下的选择是拥有一个两个应用程序都知道的文件/目录,并且由应用程序轮询或监视更改 - 请参阅http://msdn.microsoft.com/en-us/library/system.io .filesystemwatcher%28v=vs.110%29.aspx用于监控。

于 2013-01-22T08:32:57.017 回答