HELP 解决另加100分

szyuchao 2009-11-11 05:51:59
C# 中如何获取变量内存地址?不使用unsafe 可以调用API。拜托了。救命用的。
...全文
198 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mowensky 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 szyuchao 的回复:]
不行,还是有问题。请问有谁做过流明的LED灯控制板的吗?
[/Quote]
用汇编做吧。。C#不适合
wt_sanlian 2009-11-23
  • 打赏
  • 举报
回复
int CP5000_MakeWriteTimeData(IntPtr hObj, ref byte[] pBuffer, int nBufSize, ref byte[] pTimeBuffer)
szyuchao 2009-11-23
  • 打赏
  • 举报
回复
不行,还是有问题。请问有谁做过流明的LED灯控制板的吗?
szyuchao 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wt_sanlian 的回复:]
int CP5000_MakeWriteTimeData(IntPtr hObj, ref byte[] pBuffer, int nBufSize, ref byte[] pTimeBuffer)
[/Quote]

我新开帖,你来接分吧。谢谢你的提醒
godlxldog 2009-11-23
  • 打赏
  • 举报
回复
c#里获得变量地址没意义的,因为clr管理内存,所以变量地址是会变的,好像可以用个fix的关键字把变量定住,但是那个关键字好像也要在unsafe里
wuxiong100 2009-11-23
  • 打赏
  • 举报
回复
飘过。。。。。。。。
szyuchao 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wt_sanlian 的回复:]
int CP5000_MakeWriteTimeData(IntPtr hObj, ref byte[] pBuffer, int nBufSize, ref byte[] pTimeBuffer)
[/Quote]

请问你是否做过流明控制卡的吗?可否Q联系?
MaokFly 2009-11-12
  • 打赏
  • 举报
回复
luguo
szyuchao 2009-11-12
  • 打赏
  • 举报
回复
要抓狂了
szyuchao 2009-11-12
  • 打赏
  • 举报
回复
都不行啊。我这里是调用硬件的一个函数。我都试过了。
函数如下
/// <summary>
/// 生成重启控制卡命令的数据
/// </summary>
/// <param name="hObj">数据对象句柄</param>
/// <param name="pBuffer">结果数据缓冲区</param>
/// <param name="nBufSize">结果数据缓冲区的大小(字节)</param>
/// <returns>>0: 生成数据的长度(字节)-1: 不正确的数据对象句柄-4: 缓冲区长度不足</returns>
[DllImport("CP5000.dll",ExactSpelling=true, CharSet=CharSet.Ansi, SetLastError=true)]
public extern static int CP5000_MakeRestartSysData(long hObj, long pBuffer, int nBufSize);
第二个参数问开发硬件的人。他说是数组内存地址。第三个位数组的长度。
上面是我重新封装的。
原型如下
int CP5000_MakeWriteTimeData(HOBJECT hObj, BYTE *pBuffer, int nBufSize, const BYTE* pTimeBuffer)
yuanhuiqiao 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qldsrx 的回复:]
C# codeobject obj=newobject();
GCHandle handle= GCHandle.Alloc(obj, GCHandleType.Pinned);
IntPtr addr= handle.AddrOfPinnedObject();//做一些事情。//记住,不能像4楼那样释放了handle 返回一个地址,//因为一旦handle 释放,地址将不再固定,很可能会改变。//handle.Free();
[/Quote]
CLR中地址本来就不是固定的,而且GC处理没有那么及时,会立马回收,再说了即使变了,也是变成实际应用地址了,也是正确的啊
十八道胡同 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 szyuchao 的回复:]
都不行啊。我这里是调用硬件的一个函数。我都试过了。
函数如下
        /// <summary>
        /// 生成重启控制卡命令的数据
        /// </summary>
        /// <param name="hObj">数据对象句柄 </param>
        /// <param name="pBuffer">结果数据缓冲区 </param>
        /// <param name="nBufSize">结果数据缓冲区的大小(字节) </param>
        /// <returns>>0: 生成数据的长度(字节)-1: 不正确的数据对象句柄-4: 缓冲区长度不足 </returns>
        [DllImport("CP5000.dll",ExactSpelling=true, CharSet=CharSet.Ansi, SetLastError=true)]
        public extern static int CP5000_MakeRestartSysData(long hObj, long pBuffer, int nBufSize);
第二个参数问开发硬件的人。他说是数组内存地址。第三个位数组的长度。
上面是我重新封装的。
原型如下
int CP5000_MakeWriteTimeData(HOBJECT hObj, BYTE *pBuffer, int nBufSize, const BYTE* pTimeBuffer)
[/Quote]
数组内存地址就是数组首地址,用数组名传递
szyuchao 2009-11-12
  • 打赏
  • 举报
回复
有高手吗?
boringame 2009-11-11
  • 打赏
  • 举报
回复
为什么不用unsafe?
有什么特别的目的吗?
qldsrx 2009-11-11
  • 打赏
  • 举报
回复
object obj = new object();
GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);
IntPtr addr = handle.AddrOfPinnedObject();
//做一些事情。
//记住,不能像4楼那样释放了handle 返回一个地址,
//因为一旦handle 释放,地址将不再固定,很可能会改变。
//
handle.Free();
yuanhuiqiao 2009-11-11
  • 打赏
  • 举报
回复
System.Runtime.InteropServices.GCHandle gh = System.Runtime.InteropServices.GCHandle.Alloc(变量, System.Runtime.InteropServices.GCHandleType.Pinned);
int gc = gh.AddrOfPinnedObject().ToInt32();
gh.Free();
return gc;//变量地址
品铭工作室 2009-11-11
  • 打赏
  • 举报
回复
Marshal
hhc123 2009-11-11
  • 打赏
  • 举报
回复

int number;

unsafe
{
// Assign the address of number to a pointer:
int* p = &number;

// Commenting the following statement will remove the
// initialization of number.
*p = 0xffff;

// Print the value of *p:
System.Console.WriteLine("Value at the location pointed to by p: {0:X}", *p);

// Print the address stored in p:
System.Console.WriteLine("The address stored in p: {0}", (int)p);
}

// Print the value of the variable number:
System.Console.WriteLine("Value of the variable number: {0:X}", number);

System.Console.ReadKey();

用这个又没什么不好的
cc_net 2009-11-11
  • 打赏
  • 举报
回复
如何获得银行里的钱,不用抢,用要。哈哈

帮顶了

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧