私のシナリオの完全な説明をさせてください:
アプリケーションで署名パッドを使用する必要があります。これは、Silverlight 5 で開発され、Out-Of-Browser モードで信頼性を高めて使用する必要があります。問題は、デバイス メーカーがいかなる種類の API も提供していないという事実から始まります。または SDK for Silverlight の場合、それらの .NET アセンブリは実際には WinForms アプリケーション用ですが、コントロールをWindowsFormHostに配置することで WPF で引き続き使用できます。
私はオプションを探していましたが、これまでのところ 2 つの代替手段があります。どちらも、コントロールを使用してそこで署名をキャプチャし、Silverlight から呼び出す小さな WPF アプリを作成する必要があります。
- 署名が画像として保存されているフォルダをチェックする「リスナー」を作成し、Silverlight アプリケーションに送信します。
- Silverlight アプリにファイル自体を取得させるには、ユーザーがボタンをクリックする必要があります。
WPF アプリ自体から結果を取得することでこれを行うことをお勧めします。COM を使用して実行しようとしましたが、実行できませんでした。
一度に 1 つのこと (起動または別のアセンブリからの結果の取得) を行うことはできますが、両方を行うことはできません。
この記事に従って、SilverlightでCOM を使用し、この記事でアセンブリに厳密な名前を付け、この記事でCOM 相互運用性を使用する別のアプリケーションを起動しました。
上記のリンクで説明されているように (WScript.Shell Run メソッドを使用して) WPF アプリが起動され、まったく同じ .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();
}
}
そして、これは私が得るエラーです:
だから私は3つの質問があります:
- 私がやろうとしていることは可能ですか?
- これを機能させるには、どのようなアプローチを取る必要がありますか?
- これを行うための他のより簡単で効率的な方法はありますか? もしそうなら、どのように?