.net内存(net空间)

解贵文
导读 大家好,小阳来为大家解答以上的问题。 net内存,net空间这个很多人还不知道,现在让我们一起来看看吧!1、这的了解托管到非托管数据传递,你

大家好,小阳来为大家解答以上的问题。.net内存,net空间这个很多人还不知道,现在让我们一起来看看吧!

1、这的了解托管到非托管数据传递,你在c#里声明DLL形式直接关系到参数传递的方式,VB使用ByRef,C#使用ref传递的lpdwVirtualKey数组,传递方式是把托管内存内数据COPY到程序的非托管内存堆上,然后把非托管的地址上的数据给外部DLL使用,使用完成后COPY回托管内存,使用key(0)只是传递了一个LONGLONG 64位元素,所以只有两个有效,正确的应该传递数组KEY出去,声明的时候VB使用ByVal lpdwVirtualKey() As Integer,C#使用int[] lpdwVirtualKey声明,传递直接使用StartMaskKey(key,4),这样的传递到非托管效果和richardbao2000 提到的C# 中的 unsafe fixed 钉住内存效果是一样的,只是这个操作由.net框架完成了而已,这样的数据传递效果是,先把key内存空间钉住,CLR不会释放或移动它,然后把托管内存地址直接传递给外部DLL直接使用,效率更高.也就是说你声明DLL时直接这样定义就能满足你的要求VB:Private Declare Function StartMaskKey Lib "MaskKey.dll" (ByVal lpdwVirtualKey() As Integer, ByVal nLength As Integer, Optional ByVal bDisableKeyboard As Boolean = False) As IntegerC#:using System.Runtime.InteropServices;[DllImport("MaskKey.dll"]public static extern int StartMaskKey (int[] lpdwVirtualKey, int nLength,bool bDisableKeyboard );使用vbDIM key(...) as integerStartMaskKey (key,4)c#int key[]=new ...StartMaskKey (key,4,false);补充:定义内存块,.net内存,使用有托管和非托管,托管下操作内存块没意义,且只能在C++里用__pin,C# 用fixed 钉住对象所使用的内存才可操作.而且限制很大,使用非托管内存C#,VB可以使用Marshal.AllocHGlobal (Int32) 分配,不过同样没什么实用意义,因为托管程序操作非托管内存效率实在太差了,且还不容易操作,鸡肋啊!!C++里到是很方便,不过那谁都会.要屏蔽键盘消息,自己写个DLL不就行了,吃掉键盘消息就可以了.StartMaskKey(key,4)试试你可以把Keys.LWin放进long数组?我用c#怎么不行?你有dll的源代码,发给我,我来修改一下Stack a = new Stack();a.Push(Convert.ToInt64(Keys.A));使用平台调用应该会是自动转换吧,总之通过不安全代码可以实现:unsafe{ //使用stackalloc关键字来分配来连续的内存}具体怎么做我也忘了,你自已搜吧你基本上只能考虑使用 C# 中的 unsafe 和 fixed 方式。

2、.NET 下的语言并不平等,而且你要进行平台调用,必然不能完全靠 .NET CLR。

3、我觉得不修改DLL很难实现,也许是技不如人吧,可能帮不了你,抱歉找个电脑工程师吧。

本文到此分享完毕,希望对大家有所帮助。

标签:

版权声明:本文由用户上传,如有侵权请联系删除!