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.実行
ロードと初期化、ダイアログの表示ができた。めでたし。










