LabVIEW DLL的函数参数

时间:2013-11-11 17:22:58

标签: c# dll dllimport labview

我试图从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);

我没有在我的设备上进行任何初始化,而是看到一个LabVIEW vi窗口弹出,其标题类似于dll中的不同方法(即AF1_GetPressure.vi)。然后应用程序挂起,弹出这个LabVIEW窗口,我必须退出调试会话。

我想我的问题是我的函数签名可能是错误的......我使用了StringBuilder,因为我在NI网站上找到了一个示例,表明LabVIEW需要这种变量类型来更好地确定数组中的字符数。 http://www.ni.com/example/31050/en/

我尝试了各种不同的参数类型组合,但我似乎无法让它工作。如果我尝试从C ++调用dll,那么我可以让事情发挥作用。虽然,奇怪的是,我不得不在C ++中动态加载dll,因为当我尝试使用应用程序加载它时,我得到了dll初始化失败。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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)