C#调用非托管DLL:入门指南

4星 · 超过85%的资源 需积分: 50 35 下载量 130 浏览量 更新于2024-11-19 收藏 31KB DOC 举报
默认值false。 C# 调用非托管 DLL(本机 DLL)是.NET应用程序与非托管代码交互的一种常见方式,特别是在需要利用已有的C++、C或其他非托管库功能时。这种交互通常涉及到使用P/Invoke(Platform Invoke)技术,它是.NET Framework提供的一种机制,允许托管代码(如C#)调用非托管代码。 "C#通过DllImport调用非托管DLL的方法主要依赖于.NET框架的P/Invoke特性,这个特性使得C#能够跨过托管与非托管代码的界限,直接调用本机DLL中的函数。DllImport属性是实现这一功能的关键,它需要正确地配置以指定DLL的位置、调用约定、字符集、入口点等信息。" 1. P/Invoke 技术:P/Invoke是.NET Framework提供的一种接口,用于在托管代码中调用非托管动态链接库(DLL)的函数。它通过使用DllImport特性标记方法来实现。 2. DllImport 属性:DllImport 是一个自定义属性,用于指示方法是对外部DLL中的函数的引用。例如,`[DllImport("kernel32.dll")]` 声明了一个对kernel32.dll库的引用。 3. dllName 参数:这是DllImport构造函数的一个必需参数,用于指定非托管DLL的名称。例如,`DllImport("kernel32.dll")` 中的"kernel32.dll"就是目标DLL的名称。 4. CallingConvention:调用约定定义了函数参数如何在调用者和被调用者之间传递。常见的有stdcall、cdecl等,未指定时,默认为CallingConvention.Winapi。 5. CharSet:字符集定义了DLL函数如何处理字符串。可以是Auto、Unicode或Ansi,未指定时,默认为CharSet.Auto,自动选择适合的字符集。 6. EntryPoint:当非托管函数名与C#方法名不同,或者需要指定特定入口点时,使用此参数。如果不指定,将默认使用方法名作为入口点。 7. ExactSpelling:如果设为true,表示必须精确匹配DLL函数名。默认为false,意味着.NET可以尝试添加或删除“_”前缀或后缀来找到匹配的函数。 8. PreserveSig:此参数决定是否保留方法签名。如果设为true(默认),则签名不会被修改,返回类型保持原样;如果设为false,签名会被修改,添加一个名为"retval"的输出参数来表示HRESULT。 9. SetLastError:当设为true时,调用的非托管函数会设置Windows API的“上一错误”状态,这可以通过`Marshal.GetLastWin32Error()`获取。默认为false,表示不保留错误状态。 通过正确配置DllImport属性,C#开发者可以在托管代码中安全地调用非托管DLL中的函数,从而利用其功能,同时确保了跨语言和跨平台的兼容性。需要注意的是,由于非托管代码可能没有异常处理机制,因此在调用这些函数时需要特别注意错误处理和资源管理,以防止内存泄漏和程序崩溃。