コンポーネントが認識されない。。。(2)
さて、前回、新しく作ったコンポーネントがTRNSYSから認識されない状況に陥りました。
原因は参照しているMSVCR110.DLLが見つけられないこと。
このファイルが何かというと、一般には「Cランタイムライブラリ」と言われるファイルです。コンポーネントはFORTRANで書いているので、なんでCのランタイム参照してるんだという気もしますが、まあ、必要なんで参照してます。
単純な話、このMSVCR110.DLLをTRNSYSから認識できるパスに放り込んでやればエラーはでなくなります。
例)VS2012では以下のフォルダに格納されています。
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT
このフォルダから、DLLをC:\TRNSYS17\Exeフォルダにコピーします。これであっさり解決です。
落とし穴
と、ここで落とし穴が待ち構えています。この「Cランタイムライブラリ」、TRNSYS自身も参照しています。しかも厄介なことに、少し前のバージョンを参照していてファイル名も違っています。(具体的にはMSVCRT.DLLという名前のファイル)
図にすると、こんな感じ。
ここで何が問題かというと、TRNSYS本体とコンポーネントの間で参照先が違うので、実行時に齟齬が発生するケースがあります。(大部分は問題ないのですが、一部の処理で齟齬が出ます)
なんちゅーか、初版と改訂版のテキスト混在みたいな感じですかね。同じ授業なのに人によって使っているテキスト違っているから、受講者の理解している内容が違っているみたいな。ちょっと違うか。
具体的な例としては、データファイルを参照しているコンポーネントだとTRNSYS本体が割り当てたLUがコンポーネント側から見えないといった問題となって現れます。TRNSYSのデータとしては問題ないのに、エラーで動かない状況になります。
こういう時は基本的に新しい方に合わせてしまうのがよろしい。という事でTRNSYS(TRNDLL.DLL)も同じライブラリを参照するようにビルドし直してやればOK.
図にすると、こんどは、こんな感じ。
同じライブラリを参照するようになるので、齟齬もなく安心して使えます。
実作業としてはTRNDLL.DLLを開発中のコンポーネントと同じコンパイラで再ビルドすればOKです。