【发布时间】:2009-11-18 03:14:45
【问题描述】:
我在 Linux 上使用 Mono/C#,并且有以下 C# 代码:
[DllImport("libaiousb")]
extern static ResultCode QueryDeviceInfo(uint deviceIndex,
ref uint PID, ref uint nameSize, StringBuilder name,
ref uint DIOBytes, ref uint counters);
我调用了一个Linux共享库调用,定义如下:
unsigned long QueryDeviceInfo(
unsigned long DeviceIndex
, unsigned long *pPID
, unsigned long *pNameSize
, char *pName
, unsigned long *pDIOBytes
, unsigned long *pCounters
)
在调用 Linux 函数之前,我已将参数设置为已知值。我还在 Linux 函数的开头放了一个 printf,所有参数都按预期打印值。所以参数似乎从C#传递到Linux ok。返回值也不错。
但是,通过引用传递的所有其他参数都会返回垃圾。
我修改了 Linux 函数,因此它只是修改了值并返回。这是代码:
unsigned long QueryDeviceInfo(
unsigned long DeviceIndex
, unsigned long *pPID
, unsigned long *pNameSize
, char *pName
, unsigned long *pDIOBytes
, unsigned long *pCounters
) {
printf ("PID = %d, DIOBYtes = %d, Counters = %d, Name= %s", *pPID, *pDIOBytes, *pCounters, pName);
*pPID = 9;
*pDIOBytes = 8;
*pCounters = 7;
*pNameSize = 6;
return AIOUSB_SUCCESS;
所有的 ref 参数仍然作为垃圾返回。
有什么想法吗?
【问题讨论】:
-
它们是原样返回还是作为垃圾返回?
-
那么你一定是在向变量写入垃圾。我刚刚尝试过,您发布的代码应该可以按预期工作。如果你愿意,我可以发布我的示例代码作为答案。
-
顺便说一句:如果它解决了您的问题,请不要忘记接受答案。这就是 Stackoverflow.com 说“谢谢”的方式 :-)(单击问题旁边的小复选标记)
-
我修改了函数,以便更改值然后退出。没有其他的。这是linux代码: // {{{ QueryDeviceInfo() unsigned long QueryDeviceInfo( unsigned long DeviceIndex , unsigned long *pPID , unsigned long *pNameSize , char *pName , unsigned long *pDIOBytes , unsigned long *pCounters ) { printf ("PID = %d,DIOBYtes = %d,计数器 = %d,名称 = %s",*pPID,*pDIOBytes,*pCounters,pName); *pPID = 9; *pDIOBytes = 8; *pCounters = 7; *pNameSize = 6;返回 AIOUSB_SUCCESS; ref参数还是乱码
-
如果你能读懂它......它作为评论会变得非常混乱。