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);

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

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

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

任何帮助将不胜感激!

4

1 回答 1

1

我能够使用 LabView 2012 构建一个 DLL,并将其导入 .NET 4.0 控制台应用程序,调用该函数并接收结果。这是VI的截图:

LabView VI

这是 C# 中的导入语句:

[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 回答