让我对我的情景作出完整的解释:
我们需要在我们的应用程序中使用签名板,该应用程序是在Silverlight 5中以Out-Of-Browser模式开发的,具有提升的信任,问题始于设备制造商不提供任何用于Silverlight的API或SDK,它们的.NET程序集实际上是用于WinForms应用程序,但它仍然可以在WPF中使用,将控件置于WindowsFormHost。
我一直在寻找选项,到目前为止我们有两个选择,这两个选项都涉及创建一个小型WPF应用程序来使用控件并在那里捕获签名,从Silverlight调用它:
我更喜欢通过从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();
}
}
这是我得到的错误:
所以我有三个问题:
答案 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进行监控。