2020年の大晦日時点では、 .NET Framework(.NET Core)用のSDKはありません。
なのでC#(Windowsアプリ)からJavaScriptのSDKを使ってSymbolアカウントを作ってみます。
準備
1. WebView2 ランタイム、または非安定型 Microsoft Edge (Chromium) カナリア チャネルのどちらかをインストールします。 私はWebView2 ランタイムをインストールしました。 WebView2 Runtime 非安定型 Microsoft Edge (Chromium) カナリア チャネル-
VisualStudioを起動し、Windowsフォームアプリケーションのプロジェクトを作成します。
(試していませんが、WPFでも出来るはずです。多分) -
NuGetパッケージの管理から『Microsoft.Web.WebView2』をインストールします。
-
NuGetパッケージの管理から『System.Text.Json』をインストールします。
※JavaScriptからの戻り値をJSON形式で受け取るために『System.Text.Json』を使用します。
HTML作成
事前に、以下のようなHTMLファイルを作成しておきます。 これをWebView2で読み込んで、JavaScriptを実行します。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>C#(Windowsアプリ)とJavaScriptでSymbolアカウント作成</title>
</head>
<body>
<h1>C#(Windowsアプリ)とJavaScriptでSymbolアカウント作成</h1>
<script src="https://xembook.github.io/nem2-browserify/symbol-sdk-0.22.2.js"></script>
<script language="javascript" type="text/javascript">
function createAccount() {
//インスタンス生成
var nem = require("/node_modules/symbol-sdk");
//アカウント作成
var account = nem.Account.generateNewAccount(nem.NetworkType.TEST_NET);
//秘密鍵とアドレスをJSONにして返す
var obj = {
privateKey: account.privateKey,
address: account.address.plain()
};
return window.JSON.stringify(obj);
}
</script>
</body>
</html>
symbol-sdkをbrowserify化してくださっている方がいらっしゃるので、そちらを使わせてもらっています。
<script src="
createAccount関数でやっていることはコメントに書いてある通りです。
これだけでアカウントを作れてしまうなんて簡単ですね。
Windowsアプリ作成
画面はとりあえずこんな感じで。 ![画面サンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/992966/c8c3d543-58f1-a106-6a97-83e6ffd2b44f.png)JavaScriptからの戻り値をJSONで受け取るためにSystem.Text.Jsonを宣言しておきます。
using System.Text.Json;
Form1_Loadイベントで、上記で作成したHTMLを読み込みます。
(デザイナのプロパティから設定することも出来ます)
private void Form1_Load(object sender, EventArgs e)
{
//HTML読み込み
webView21.Source = new Uri("file:///C:/WinFormSymbol.html");
}
button1_Clickイベントで、Symbolアカウントを作成するJavaScriptの関数を実行し、秘密鍵とアドレスを受け取ります。
private async void button1_Click(object sender, EventArgs e)
{
//Symbolアカウント作成
string result = await webView21.ExecuteScriptAsync("createAccount()");
//先頭と最後の"を除去
result = result.Trim('"');
//\"を"に変換
result = result.Replace("\\\"", "\"");
//デシリアライズ
var json = JsonSerializer.Deserialize>(result);
lblPrivateKey.Text = json["privateKey"];
lblAddress.Text = json["address"];
}
webView21.ExecuteScriptAsync("createAccount()")で、HTMLファイルで記述したJavaScriptのcreateAccount関数を実行しています。
戻り値に余計なものが付いてきていたので除去したり変換したり。
その後、デシリアライズしてラベルにセットして完了です。
まとめたものです。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//HTML読み込み
webView21.Source = new Uri("file:///C:/WinFormSymbol.html");
}
private async void button1_Click(object sender, EventArgs e)
{
//Symbolアカウント作成
string result = await webView21.ExecuteScriptAsync("createAccount()");
//先頭と最後の"を除去
result = result.Trim('"');
//\"を"に変換
result = result.Replace("\\\"", "\"");
//デシリアライズ
var json = JsonSerializer.Deserialize>(result);
lblPrivateKey.Text = json["privateKey"];
lblAddress.Text = json["address"];
}
}
いずれは.NET Framework(.NET Core)用のSDKを誰かが作ってくれると思いますが、WindowsアプリでSymbolを使うならこういうやり方もあります、ということで。
それでは良いお年を。