JRA-VAN Datalab JV-Link を Visual Studio2019 C#で使用する
https://jra-van.jp/dlb/sdv/index.html
JRA-VAN からデータを取得するプログラムを作成しようとして、JV-Linkを初期化するまでに、結構ハマったので、手順をメモ。
1.Windows Forms C#プロジェクトを作成
2.JVLink Classの参照追加
2.1 ツールボックスアイテムの選択
2.2 JVLink Classにチェックを入れてOK
手順書通りなら、これで、ツールボックスにJVLink のアイコンが表示され、フォームに配置することで、動かせるはず(VB.NETの場合)なのだが、C#では、ツールボックスにJVLinkのアイコン表示されず(全て表示にすると、利用不可状態で淡色表示されるが、フォームデザイナにドロップできない状態)なので、SDK付属のVBのサンプルを以下の手順で、動作確認する。
結果、C#プロジェクトにも同様の対応をする
3.VB2005用のサンプルをVB2019で動かす
ターゲットフレームワークがインストールされていないというエラーが出るため、、
ツールと機能を取得から、個別のコンポーネントを選択し、
.NET Framework 4.6.1 Targeting Pack をインストール
さらに、構成プロパティから、プラットフォームを、x86に変更する
これで、添付のサンプルは動くようになった。
4.ライブラリの参照追加
JVLinkのライブラリは、どうやら、VB6で作成されたものっぽい。正しくビルドされると、.NET用のラッパーのライブラリが生成されるようなのだが、今回画面にJVLinkオブジェエクトを配置できなく、ビルドができないので、おそらくビルドすると生成されるであろう、以下の2ライブラリが生成されない。
SDKに添付されているVB2005のサンプル中に返還後のライブラリが含まれるため、今回のC#版でも、そのライブラリを参照する。
また、ローカルにコピーを「はい」にしておく。
- AxInterop.JVDTLabLib
- Interop.JVDTLabLib
5.テストコードの実装
動作確認用にボタンを一つ画面に落とす。
フォームのコードに、SDKのVBサンプルのコードを参照して、JVLinkコントロールの内容を移植する。
本来、画面にコントロールを貼り付ける形だと、InitializeComponentの中に、IDEが自動生成するのだろうが、そこに書くと消えてしまうので、呼び出し前に同じように記述する。this.Contorols.Addの行がないと、OCXコントロールの準備が整わないうちに、Form Loadedになってしまうようで以下のエラーが発生、しばらくはまった。
例外がスローされました: 'System.Windows.Forms.AxHost.InvalidActiveXStateException' (AxInterop.JVDTLabLib.dll の中) 現時点ではメソッド 'JVInit' を呼び出せません。
using System; using System.Diagnostics; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using AxJVDTLabLib; namespace JRA_VAN_PROTO { public partial class Form1 : Form { private AxJVLink jVLink = new AxJVDTLabLib.AxJVLink(); private System.Resources.ResourceManager resources; public Form1() { resources = new System.Resources.ResourceManager(this.GetType()); jVLink.Location = new System.Drawing.Point(0, 0); jVLink.Name = "jVLink"; jVLink.OcxState = (System.Windows.Forms.AxHost.State)resources.GetObject($"{jVLink.Name}.OcxState"); jVLink.Size = new System.Drawing.Size(10, 10); this.Controls.Add(jVLink); InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { jVLink.JVSetUIProperties(); } private void Form1_Load(object sender, EventArgs e) { try { var ret = jVLink.JVInit("UNKNOWN"); Debug.WriteLine($"RET={ret}"); } catch (Exception exception) { Debug.WriteLine(exception); } } } }
6.実行
ロードと初期化、ダイアログの表示ができた。めでたし。