C# LabVIEW DLL的函数参数

C# LabVIEW DLL的函数参数,c#,dll,dllimport,labview,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); Stri

我试图从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);
在我的应用程序中,我只需使用以下命令即可调用此命令:

[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需要这种变量类型来更好地确定数组中的字符数

我已经尝试了各种不同的参数类型组合,但我似乎根本无法实现这一点。如果我尝试从C++调用DLL,那么我可以让事情正常工作。虽然奇怪的是,我不得不动态地加载C++中的DLL,因为当我试图用应用程序加载DLL初始化失败时,我得到了一个DLL初始化失败。
任何帮助都将不胜感激

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

下面是C#中的import语句:

我建议你尝试一些非常简单的方法,看看你能不能让它工作起来

我应该注意到,我曾尝试将参数作为
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)

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

下面是C#中的import语句:

我建议你尝试一些非常简单的方法,看看你能不能让它工作起来

我应该注意到,我曾尝试将参数作为
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)

我碰巧有Labview 2012(带ApplicationBuilder)和VS2010,所以我可能可以尝试一下,但我从来没有用Labview创建过DLL。你能简要概述一下你遵循的流程吗,或者链接到VI?好的。。。这就是奇怪的部分。。。我受到@Steve的启发,从一个精简的应用程序调用提供的LabVIEW DLL。因此,我创建了一个快速Windows窗体应用程序并调用了我的DLL。奇迹般的是,它成功了!我回到我的应用程序框架,尝试在组件初始化后从主窗体的构造函数调用DLL,再次获得成功。然后,我尝试从主窗体的On_Load事件调用DLL,也就是当应用程序无法加载DLL时。所以,问题是,到底是什么导致了失败?我碰巧有Labview 2012(带ApplicationBuilder)和VS2010,所以我可能可以尝试一下,但我从来没有用Labview制作过DLL。你能简要概述一下你遵循的流程吗,或者链接到VI?好的。。。这就是奇怪的部分。。。我受到@Steve的启发,从一个精简的应用程序调用提供的LabVIEW DLL。因此,我创建了一个快速Windows窗体应用程序并调用了我的DLL。奇迹般的是,它成功了!我回到我的应用程序框架,尝试在组件初始化后从主窗体的构造函数调用DLL,再次获得成功。然后,我尝试从主窗体的On_Load事件调用DLL,也就是当应用程序无法加载DLL时。所以,问题是,什么是btw表单构造和加载导致失败的原因?嗨,Steve。谢谢你的回复。我也在努力跟进NI网站。请您将导出的函数声明放到头文件中好吗?我已经把它添加到我的答案中了。希望有帮助。谢谢史蒂夫。我刚刚发现,当我通过C++调用供应商的LabVIEW DLL时,我将使所有的工作都正确,但是我看到在加载了一个NI DLL之后抛出的内存异常:“TestelvFLUL.exe”:加载的C:\Windows \Stult32 \NimeCuC.DLL,在TestelVeluff.Exe中,0x7C812AFB中无法找到或打开PDB文件第一机会异常:微软C++异常:在内存位置0x023 BC870内存LV除外。我正在和NI社区联系,但还没有人回应。对此我不确定。。。PDB文件用于符号调试。我的猜测是,它试图找到它来帮助您调试异常,但无法。不幸的是,我想我帮不了什么忙了。祝你好运!你可能想拒绝我的回答,因为你仍然有你的问题(或者没有,我喜欢代表:)嗨,史蒂夫。谢谢你的回复。我也在努力跟进NI网站。请您将导出的函数声明放到头文件中好吗?我已经把它添加到我的答案中了。希望有帮助。谢谢史蒂夫。我刚刚发现,当我通过C++调用供应商的LabVIEW DLL时,我将使所有的工作都正确,但是我看到在加载了一个NI DLL之后引发了一个内存异常: