让我对我的场景进行一个完整的解释:
我们需要在我们的应用程序中使用签名板,该应用程序是在 Silverlight 5 中开发的,在浏览器外模式下,具有更高的信任度,问题始于设备制造商不提供任何类型的 API 的事实或用于 Silverlight 的 SDK,它们的 .NET 程序集实际上是用于 WinForms 应用程序的,但通过将控件放在WindowsFormHost中,它仍然可以在 WPF 中使用。
我一直在寻找选项,到目前为止,我们有 2 个备选方案,这两个备选方案都涉及创建一个小型 WPF 应用程序来使用控件并在那里捕获签名,从 Silverlight 调用它:
- 创建一个“侦听器”,检查将签名保存为图像的文件夹并将其发送到 silverlight 应用程序。
- 让 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();
}
}
这是我得到的错误:
所以我有三个问题:
- 我正在尝试做的事情可能吗?
- 我应该采取什么方法才能使它起作用?
- 有没有其他更简单/更有效的方法来做到这一点?如果是这样,如何?