Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非托管/托管互操作-无法传递int[]_C#_Interop_Unmanaged_Marshalling_Managed - Fatal编程技术网

C# 非托管/托管互操作-无法传递int[]

C# 非托管/托管互操作-无法传递int[],c#,interop,unmanaged,marshalling,managed,C#,Interop,Unmanaged,Marshalling,Managed,我正在攻读化学博士学位,因此我需要编写一个软件应用程序来帮助我在显微镜下对样品进行成像。该显微镜配有x-y-z纳米定位台。该阶段使用硬件供应商用VC++编写的非托管DLL进行控制。我可以为您提供所需的更多细节,但让我从这里开始 dll中的一种方法允许我读取运动轴的设置: C++语法: BOOL E7XX_qSVO (int ID, const char* szAxes, BOOL* pbValueArray) 其中BOOL根据约定为int 0或1 我的C#包装包含: [DllImport("

我正在攻读化学博士学位,因此我需要编写一个软件应用程序来帮助我在显微镜下对样品进行成像。该显微镜配有x-y-z纳米定位台。该阶段使用硬件供应商用VC++编写的非托管DLL进行控制。我可以为您提供所需的更多细节,但让我从这里开始

dll中的一种方法允许我读取运动轴的设置:

C++语法:

BOOL E7XX_qSVO (int ID, const char* szAxes, BOOL* pbValueArray) 
其中BOOL根据约定为int 0或1

我的C#包装包含:

[DllImport("E7XX_GCS_DLL.dll", EntryPoint = "E7XX_qSVO")]   
public static extern int qSVO(int iId, string sAxes, int []iValArray);
我觉得这是对的。但是,当我在主应用程序中尝试类似的操作时(查询轴1、2和3):

我总是得到这样一个数组:

{6,0,10}而我应该根据设备本身上的显示获取{0,0,0}。补充功能:

BOOL E7XX_SVO(int-ID,const-char*szAxes,const-BOOL*pbValueArray)
在后台设置相同的状态位也不起作用

dll中的其他命令工作正常。我可以毫无问题地传递字符串和双精度输入输出,但不能传递布尔类型


<>你知道有什么不对吗?< /p> C++中的BoL实际上是一个“int”,所以确保你使用Stimult.INT32而不是Stult.BooLeIn。 或者,它可能使用COM数据类型,即VARIANT_BOOL,在这种情况下,您需要System.Boolean。
您是否尝试过运行dependency viewer来确认函数原型?

这不会直接回答您的问题,但是一个方便获取常见互操作Win32调用的工具是使用Pinvoke.net,它甚至有一个Visual Studio插件

他们说:

VC++编译器需要一个外部“C”修饰符。声明还必须指定这些函数的调用方式与标准WinAPI函数类似。这意味着VC++编译器需要在声明中看到WINAPI或_stdcall修饰符

DllImport
的默认调用约定是WinApi。在Windows上,这是StdCall。但在CE上,这是Cdecl。您要确保使用正确的呼叫约定。您可能需要添加以下内容:

CallConvention = CallingConvention.StdCall
另外,请指定我们的字符串集:

CharSet = CharSet.Ansi

但即使没有这些,它也应该有效。这很奇怪,因为您的代码看起来很正确。

您是否尝试过指定MarshalAs属性,例如:-

[DllImport("E7XX_GCS_DLL.dll", EntryPoint = "E7XX_qSVO")]   
public static extern int qSVO(int iId, 
                              [MarshalAs(UnmanagedType.AnsiBStr)]string sAxes, 
                              [MarshalAs(UnmanagedType.LPArray)]int[] iValArray);
另外,您是否尝试过将SAXS字符串作为字符数组传递,例如:-

[DllImport("E7XX_GCS_DLL.dll", EntryPoint = "E7XX_qSVO")]   
public static extern int qSVO(int iId, 
                              [MarshalAs(UnmanagedType.LPArray)]char[] sAxes, 
                              [MarshalAs(UnmanagedType.LPArray)]int[] iValArray);

我发现,对于interop,您通常需要进行一些实验才能使其正常工作,因此,请尝试不同的组合,查看UnmanagedType枚举的不同成员,并考虑其他人的建议。但是,请尝试以上两种技术,并让我知道它们是否有助于排序

您是否检查了返回值以查看是否发生了错误?您在哪个平台上运行?具体来说,您访问的API是64位API吗?
[DllImport("E7XX_GCS_DLL.dll", EntryPoint = "E7XX_qSVO")]   
public static extern int qSVO(int iId, 
                              [MarshalAs(UnmanagedType.LPArray)]char[] sAxes, 
                              [MarshalAs(UnmanagedType.LPArray)]int[] iValArray);