Wolfram EngineをVisualBasicで使う(1:VisualStudioでの流れを把握)
以前はWolfram EngineをJupyterから呼び出せるようにして、ノートブックのように使えるようにした。
今回は、VisualBasicからWolfram Engineを読んで計算をさせてみたいと思います。
おそらく、このほうが多くの人に役立つと思います。
(ExcelのVBAで試してみたのですが、こちらはうまくいきませんでした)
まずは、Wolfram Engine(執筆時点ではv13.3)がすでにインストールされているという状態から始めます。
Wolfram Engineをインストールすると
C:\Program Files\Wolfram Research\Wolfram Engine\13.3\SystemFiles\Links |
に、「NETLink」というフォルダーがあります。
これがWolfram EngineとVDA(または.NET)をつなぐ部分です。
では、VisualStudio側のセットアップを進めます。
今回はGUI付きの簡単なプリケーションを作成したいと思います。
- 右側の「ソリューションエクスプローラー」の「依存関係」のコンテキストメニューから「プロジェクト参照の追加」を選択します。
- 左の「参照」を選択して、下の「参照」ボタンを押します。
- 上で説明した「NETLink」フォルダー内の「Wolfram.NETLink.dll」「ml64i4.dll」を選択して、「追加」をクリックします。
ここで「ml64i4.dll」を指定し忘れたりすると、ビルド時に次のようなエラーが出ます。
DllNotFoundException: Unable to load DLL 'ml64i4.dll' or one of its dependencies: 指定されたモジュールが見つかりません。 (0x8007007E)
- 「OK」をクリックすると、依存関係に「Wolfram.NETLink」が追加されます。
さて、この中には何が含まれているんでしょう?
- コンテキストメニューで「オブジェクトブラウザーで表示」を選択します。
- ツリーを見ると、メインは「Wolfram.NETLink」ですね。
-
まずは、計算した結果をスタティックなテキストとして表示するところから始めます。画面の左側にツールボックスを表示して、画面のレイアウトを作成していきます(「表示」->「ツールボックス」で表示できる。ピン止めしておくと使いやすい)。
左側側から「TextBox」をレイアウト上にドラッグ&ドロップします。
- 次に「Button」をドラッグして、右の「プロパティ」の「Text」で「Run」と表示されるようにします。
- 配置したボタンをダブルクリックして、ボタンを押したときの動作をVisualBasicで各画面に移ります。
Imports Wolfram.NETLink
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")
ml.WaitAndDiscardAnswer()
Dim result As String = ml.EvaluateToOutputForm("10+2", 0)
TextBox1.Text = result
End Sub
End Class
と記載します。
Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")
は、Wolfram Engineに含まれるMathematicaのKernelを起動するコマンドです。
ml.WaitAndDiscardAnswer()
は、初期化のような感じで、カーネルの初期の値を廃棄するもののようです。
Dim result As String = ml.EvaluateToOutputForm("10+2", 0)
が、実際の計算部分で、最初は「10+2」をハードコードして動きを確認します。
EvaluateToOutputFormの2つ目の引数は、ページの幅(文字数)を指していて、この文字数で改行を入れるものです。「0」は「改行なし」で、通常はこれでよいと思います。
- さて、実際にVisualStudio内で動かしてみましょう。
- ビルドが終わると、次のダイアログが表示されます。
- 「Run」をクリックすると、後ろでWolframカーネルが起動し、下のテキストボックスに計算結果の「12」が表示されました。
右上の「X」でダイアログを閉じます。
これをexe形式にする方法を見てみます。
-
モードを「Release」に変更します。
- 「ビルド」->「WinFormsApp1のビルド」を選択します。
-
完了すると、画面の下の「出力」に
========== ビルド は xx:xx に開始され、xx.xxx 秒 かかりました ==========
と表示されます。 -
VisualStudio側で設定を変えていなければ、
C:\Users\ユーザー名\source\repos\WinFormsApp1\WinFormsApp1\bin\Release\net6.0-windows
の下に、「WinFormsApp1.exe」ができていると思います。
さて、これをダブルクリックしてみるとどうなるか。
おお!きちんと動く。
同じマシンで動かしているから、Wolframカーネルの指定に絶対パスを入れていても問題ないから当然か。
ターゲットのフォルダーの中を見ると次のようになっています。
Wolfram.NETLink.dllもきちんと入ってます。
このフォルダーを他の人に渡す場合でも、その人のマシンにWolfram Engineが同じ階層(デフォルトの設定)で入っていれば動くはず。
Copyright (c) 2023-2024, techtechlab by DataWith