我目前正在研究USB设备,该设备需要从其他设备进行采集。
我遇到<target name="prepare-asm" depends="package,check-components-properties">
<mkdir dir="${build.asm.classes}"/>
<javac srcdir="${jikesrvm.dir}/tools/asm-tasks/src" destdir="${build.asm.classes}" debug="true" classpath="${asm.jar}:${build.vm.jar}:${build.rt.jar}" includeantruntime="false"/>
</target>
问题,无法在c#中重现。
在Dll的源代码中,我有这个:
typedef struct
这是我的代码:
typedef struct _UF01_INFORMATIONS{
BYTE Type[MAX_MODULE];
BYTE Nombre_Module;
BYTE Nb_Voies[MAX_MODULE];
BYTE Modele[MAX_MODULE];
char *Name[MAX_MODULE];
char *Comments[MAX_MODULE];
BOOL UseInterrupt;
} UF01_INFORMATIONS, *PUF01_INFORMATIONS;
MAX_MODULE equals 8 ^^
“ UF01_GetInfosModule”行的错误是:“ PInvoke托管签名与非托管签名不同”
我正在搜索,但是找不到为什么出现此错误。
感谢您的帮助!
答案 0 :(得分:-1)
我的代码现在是:
public partial class Form1 : Form {
[DllImport(@"C:\Program Files (x86)\SELIAtec\UF01\UF01.dll", EntryPoint = "UF01_OpenDevices", CallingConvention = System.Runtime.InteropServices.CallingConvention.Winapi)]
unsafe static extern Boolean UF01_OpenDevices(ref byte devices);
[DllImport(@"C:\Program Files (x86)\SELIAtec\UF01\UF01.dll", EntryPoint = "UF01_CloseAll", CallingConvention = System.Runtime.InteropServices.CallingConvention.Winapi)]
unsafe static extern void UF01_CloseAll();
[DllImport(@"C:\Program Files (x86)\SELIAtec\UF01\UF01.dll", EntryPoint = "UF01_UD01_8Entrees", CallingConvention = System.Runtime.InteropServices.CallingConvention.Winapi)]
unsafe static extern Boolean UF01_UD01_8Entrees(byte Device, byte module, ref byte data);
[DllImport(@"C:\Program Files (x86)\SELIAtec\UF01\UF01.dll", EntryPoint = "UF01_UD01_8Entrees", CallingConvention = System.Runtime.InteropServices.CallingConvention.Winapi)]
unsafe static extern Boolean UF01_GetInfosModule(byte Device, bool Watchdog, ref _UF01_INFORMATIONS infos);
[DllImport(@"C:\Program Files (x86)\SELIAtec\UF01\UF01.dll", EntryPoint = "UF01_UA01_Entrees", CallingConvention = System.Runtime.InteropServices.CallingConvention.Winapi)]
unsafe static extern Boolean UF01_UA01_Entrees(byte Device, byte Module, ref ushort[] TableData_12bit);
public Form1()
{
InitializeComponent();
}
[StructLayout(LayoutKind.Sequential)]
public struct _UF01_INFORMATIONS
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Type;
[MarshalAs(UnmanagedType.U1)]
public byte Nombre_Module;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Nb_Voies;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Modele;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public string[] Name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public string[] Comments;
[MarshalAs(UnmanagedType.I1)]
public bool UseInterrupt;
}
private unsafe void button1_Click(object sender, EventArgs e)
{
byte nb_Device = 0;
ushort[] data = new ushort[8];
_UF01_INFORMATIONS m_infos = new _UF01_INFORMATIONS();
m_infos.Type = new byte[8];
m_infos.Nb_Voies = new byte[8];
m_infos.Modele = new byte[8];
m_infos.Name = new string[8];
m_infos.Comments = new string[8];
m_infos.Nombre_Module = 0;
m_infos.UseInterrupt = false;
if (UF01_OpenDevices(ref nb_Device))
{
this.label1.Text = "Nombre de CPU's : " + nb_Device;
if (UF01_GetInfosModule(nb_Device, false, ref m_infos))
label2.Text = "Nombre de modules : " + m_infos.Nombre_Module.ToString();
if (UF01_UA01_Entrees(nb_Device, 1, ref data))
label3.Text = "Donnee : " + data[0].ToString();
}
}
}
第一个称为UF01_OpenDevices的函数起作用。它在ref变量中返回设备数。但是其他两个功能不起作用。他们返回假。 我不知道为什么...