如何在Silverlight 5 Out of Browser应用程序中启动应用程序并从中获取结果

时间:2012-11-16 21:20:17

标签: wpf com silverlight-5.0 silverlight-oob

让我对我的情景作出完整的解释:

我们需要在我们的应用程序中使用签名板,该应用程序是在Silverlight 5中以Out-Of-Browser模式开发的,具有提升的信任,问题始于设备制造商不提供任何用于Silverlight的API或SDK,它们的.NET程序集实际上是用于WinForms应用程序,但它仍然可以在WPF中使用,将控件置于WindowsFormHost

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

  1. 创建一个“侦听器”,用于检查将签名保存为图像的文件夹,并将其发送到silverlight应用程序。
  2. 让Silverlight应用程序获取文件本身,用户必须单击此按钮。
  3. 我更喜欢通过从WPF应用程序本身检索结果来做到这一点,我尝试使用COM但不能这样做。

    我可以一次做这些事情之一(启动或从另一个程序集中获取结果)但不是两者都可以。

    我将这篇文章发布到use COM in Silverlight,将此文章跟随give the assembly a strong name,然后将此文章发送到launch another application using COM Interoperability

    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();
            }
        }
    

    这是我得到的错误:

    enter image description here

    所以我有三个问题:

    1. 我正在尝试做什么?
    2. 我应采取什么方法来实现这一目标?
    3. 还有其他更简单/更有效的方法吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分: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进行监控。