症状
.NETコントロールのイベント処理で、コールバックVIを使用すると、呼び出し元のVIが終了しているにも関わらず、コールバックVIが使用中で編集できなくなります。
イベントコールバックVIを、ライブラリに属させている場合は、ライブラリ全体がロックされてしまうので、とても作業しづらい状態になります。
原因と対処法
LabVIEWの既知の問題リストに、リファレンスを閉じた後もコールバックVIを予約したままになることが記載されています。
対処方法には
「コールバックVIのリファレンスを閉じた後、またはコールバックVIを予約解除するために別のVIでインボークノードからGC.Collect()を呼び出します。」
とあります。
新規VIを作成して下記のインボークノードを配置して実行します。
アセンブリ名: mscorlib
オブジェクト名: System.GC
メソッド名: Collect
このVIを実行すると、コールバックVIのロックが解除されるはずです。
ちなみに、GC.Collect メソッドは強制的にガベージコレクションを実行するメソッドです。
自動化する
ガベージコレクションを実行すれば良いことが分かったので、終了処理に組み込んで自動化します。
実際にやってみると、VIが実行中は、当該の.NETコントロールが使用中のためなのか、開放されませんでした。
VI終了後に、手動で別のVIからガベージコレクションを実行するときちんと開放されます。これはかなりめんどくさいですね。
少し工夫して、非同期呼び出しで別のVIからガベージコレクションが実行されるようにします。
結果、手動の場合と同様にロックが解除されましたが、ガベージコレクション実行前にWaitを入れる必要がありました。
開発環境でのみ必要な処理なので、実行時間を気にする必要がありません。
開発環境の場合だけ実行するようにして、十分に長いWaitを設定しておくと良さそうです。
関連情報
LabVIEW 2019 and 2019 SP1 Known Issues
http://www.ni.com/product-documentation/55105/en/
VIを非同期で呼び出す
http://zone.ni.com/reference/ja-XX/help/371361R-0112/lvconcepts/asynchronous_vi_calls/
GC.Collect メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.gc.collect?view=netframework-4.8