6. 与本地代码(Native Code)互用
6.1. 如何调用本地代码写的DLL中的函数?
本地DLL代码可以通过系统的Invoke (P/Invoke)方法调用。这些文章提供了如何实现调用和更多的调用技巧:
学习如何使用.net精简框架的Platform Invoke (P/Invoke)细节:
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfintrointerp.asp
深入探索.net精简框架下的互用性。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfadvinterop.asp
学习如何通过P/Invoke建立智能设备上的非托管代码。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/unmanagedfuncs.asp
如何在.net精简框架上汇集托管和非托管代码的数据。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfmarshallingtypes.asp
学习使用工具dumpbin.exe在微软.net精简框架的应用中申明P/Invokes。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfdumpbinpinvoke.asp
6.2. 如何使用dumpbin.exe帮助描述 P/Invokes?
见本问答的 "6.1. 如何调用本地写的DLL中的函数? " 章节。
6.3. 如何为微软.net精简框架写非托管代码?
见本问答的 "6.1. 如何调用本地写的DLL中的函数? " 章节。
6.4. 如何调用 P/Invoke GetTickCount?
不需要使用P/Invoke调用GetTickCount功能,因为Environment.TickCount就提供了这个功能。
见本问答的 " 7.2. 如何计算精确的时间间隔?" 章节。
6.5. 如何获得系统还有多少可用内存?
您可以调用GetSystemMemoryDivision和GlobalMemorySystem函,数获得程序和存储器间有多少内存是隔离的和已经分配的。
参数的说明可以在API参考文档中找到。
//C#
using System.Runtime.InteropServices;
public class MEMORYSTATUS
{
public uint dwLength;
public uint dwMemoryLoad;
public uint dwTotalPhys;
public uint dwAvailPhys;
public uint dwTotalPageFile;
public uint dwAvailPageFile;
public uint dwTotalVirtual;
public uint dwAvailVirtual;
}
[DllImport("CoreDll.dll")]
public static extern void GlobalMemoryStatus
(
MEMORYSTATUS lpBuffer
);
[DllImport("CoreDll.dll")]
public static extern int GetSystemMemoryDivision
(
ref uint lpdwStorePages,
ref uint lpdwRamPages,
ref uint lpdwPageSize
);
public void Test()
{
uint storePages = 0;
uint ramPages = 0;
uint pageSize = 0;
int res = GetSystemMemoryDivision(ref storePages, ref ramPages, ref pageSize);
MEMORYSTATUS memStatus = new MEMORYSTATUS();
GlobalMemoryStatus(memStatus);
}
'VB
Imports System.Runtime.InteropServices