1

LabVIEWで生成されたDLLから関数を呼び出そうとしています。これは、実際よりもはるかに簡単になると思いました。機能は次のとおりです。

void __cdecl Device_Init(char DevName[]);

したがって、私のC#コードでは、次のことを試みています:

[DllImport(@"Device.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void Device_Init(StringBuilder name);

以下を使用するだけで、アプリケーションでこれを呼び出します。

StringBuilder devName = new StringBuilder(DeviceName);
Device_Init(devName);

デバイスで初期化を取得するのではなく、dll 内の別のメソッド (つまり、AF1_GetPressure.vi) に似たタイトルを持つ LabVIEW vi ウィンドウがポップアップ表示されます。その後、この LabVIEW ウィンドウがポップアップした状態でアプリケーションがハングし、デバッグ セッションを終了する必要があります。

私の質問は、関数の署名がどのように間違っている可能性があるかということだと思います...NIのWebサイトで、LabVIEWが配列内の文字数をより適切に確認するためにこの変数タイプを必要とすることを示しているように見える例を見つけたので、StringBuilderを使用しました。http://www.ni.com/example/31050/en/

パラメータタイプのあらゆる種類のさまざまな組み合わせを試しましたが、これを機能させることができないようです。C++ から dll を呼び出そうとすると、動作するようになります。奇妙なことに、アプリケーションで dll をロードしようとしたときに dll の初期化エラーが発生したため、C++ で dll を動的にロードする必要がありました。

どんな助けでも大歓迎です!

4

1 に答える 1

1

LabView 2012 で DLL をビルドし、それを .NET 4.0 コンソール アプリケーションにインポートして、関数を呼び出し、結果を受け取ることができました。VIのスクリーンショットは次のとおりです。

LabView VI

C# の import ステートメントは次のとおりです。

[DllImport(@"SharedLib.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int StringLength(string str);

このような非常に単純なことを試してみて、それが機能するかどうかを確認することをお勧めします。

パラメータをオブジェクトとして渡そうとしたところStringBuilder、うまくいきました。

また、この質問を LabView フォーラムに投稿することをお勧めします。そこでは常に非常に迅速な応答を得ることができました。LabView を使用すると、StackOverflow よりも優れた応答が得られる可能性が高いと思います。

要求に応じて、LabView によって生成された .h ファイルの内容は次のとおりです。

#include "extcode.h"
#pragma pack(push)
#pragma pack(1)

#ifdef __cplusplus
extern "C" {
#endif

/*!
 * StringLength
 */
int32_t __cdecl StringLength(char String[]);

long __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);

#ifdef __cplusplus
} // extern "C"
#endif

#pragma pack(pop)
于 2013-11-11T18:36:02.237 に答える