我试图从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初始化失败。
非常感谢任何帮助!
答案 0 :(得分:1)
我能够使用LabView 2012构建DLL,并将其导入.NET 4.0控制台应用程序,调用该函数并接收结果。以下是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)