技術屋にゃん兵衛のてくてくらぼ by データウィズ [DataWith]

気の向くままソフトについて書いてます。バリバリエンジニアではないのであくまでも初心者目線で。

Wolfram EngineをVisualBasicで使う(1:VisualStudioでの流れを把握)

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付きの簡単なプリケーションを作成したいと思います。

 

  1. 右側の「ソリューションエクスプローラー」の「依存関係」のコンテキストメニューから「プロジェクト参照の追加」を選択します。

    VisualStudioの依存関係の設定
  2. 左の「参照」を選択して、下の「参照」ボタンを押します。

  3. 上で説明した「NETLink」フォルダー内の「Wolfram.NETLink.dll」「ml64i4.dll」を選択して、「追加」をクリックします。

    ここで「ml64i4.dll」を指定し忘れたりすると、ビルド時に次のようなエラーが出ます。

    DllNotFoundException: Unable to load DLL 'ml64i4.dll' or one of its dependencies: 指定されたモジュールが見つかりません。 (0x8007007E)

  4. 「OK」をクリックすると、依存関係に「Wolfram.NETLink」が追加されます。

    Wolfram.NETLinkが追加された

    さて、この中には何が含まれているんでしょう?

  5. コンテキストメニューで「オブジェクトブラウザーで表示」を選択します。

    オブジェクトブラウザーに切り替え
  6. ツリーを見ると、メインは「Wolfram.NETLink」ですね。

    Wolfram.NETLink等の内容
  7. まずは、計算した結果をスタティックなテキストとして表示するところから始めます。画面の左側にツールボックスを表示して、画面のレイアウトを作成していきます(「表示」->「ツールボックス」で表示できる。ピン止めしておくと使いやすい)。

    左側側から「TextBox」をレイアウト上にドラッグ&ドロップします。

    テキストボックスの配置
  8. 次に「Button」をドラッグして、右の「プロパティ」の「Text」で「Run」と表示されるようにします。

    ボタンの配置
  9. 配置したボタンをダブルクリックして、ボタンを押したときの動作を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」は「改行なし」で、通常はこれでよいと思います。

  10. さて、実際にVisualStudio内で動かしてみましょう。

    VisualStudio内で起動する
  11. ビルドが終わると、次のダイアログが表示されます。

    作成したダイアログ
  12. 「Run」をクリックすると、後ろでWolframカーネルが起動し、下のテキストボックスに計算結果の「12」が表示されました。

    Wolfram Kernelでの計算結果が表示された

    右上の「X」でダイアログを閉じます。

    これをexe形式にする方法を見てみます。

  13. モードを「Release」に変更します。

    Releaseモードへの変更
  14. 「ビルド」->「WinFormsApp1のビルド」を選択します。

  15. 完了すると、画面の下の「出力」に

    ========== ビルド は xx:xx に開始され、xx.xxx 秒 かかりました ==========

    と表示されます。
  16. VisualStudio側で設定を変えていなければ、

    C:\Users\ユーザー名\source\repos\WinFormsApp1\WinFormsApp1\bin\Release\net6.0-windows

    の下に、「WinFormsApp1.exe」ができていると思います。

 

さて、これをダブルクリックしてみるとどうなるか。

おお!きちんと動く。

exeを実行した結果

 

同じマシンで動かしているから、Wolframカーネルの指定に絶対パスを入れていても問題ないから当然か。

ターゲットのフォルダーの中を見ると次のようになっています。

Wolfram.NETLink.dllもきちんと入ってます。

このフォルダーを他の人に渡す場合でも、その人のマシンにWolfram Engineが同じ階層(デフォルトの設定)で入っていれば動くはず。

 

今回はここまで。