DllImport 属性的常见用法。第一节讨论使用 DllImport 从托管应用程序调用本机代码的优点。第二节集中讨论封送处理和 DllImport 属性的各个方面。从托管应用程序调用非托管代码
当在托管应用程序中重用现有的非托管代码时,DllImport 属性非常有用。例如,托管应用程序可能需要调用非托管 WIN32 API。下面的代码示例说明此通用方案,此示例将调用 MessageBox(位于 User32.lib 中):#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttributenamespace SysWin32
{
[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption,
unsigned int uType);
}int main( )
{
SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );
}
主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。当调用用户定义的 DLL 中所包含的函数时,有必要将 extern "C" 添加在 DLL 函数声明之前,如下所示:// The function declaration in SampleDLL.h file
extern "C" SAMPLEDLL_API int fnSampleDLL(void);
有关受支持的其他参数值的更多信息,请参见 DllImport。将非结构化参数由托管封送处理为非托管
除使用上述方法外,还可以使用另一种方法将托管参数(来自托管应用程序)封送处理为非托管参数(在非托管 DLL 中)。以下代码示例说明封送处理技术:#using <mscorlib.dll>
using namespace System; // To bring System::String in
using namespace System::Runtime::InteropServices;
// for DllImportAttribute
namespace SysWin32
{
[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
Int32 MessageBox( Int32 hWnd, String* lpText, String* lpCaption,
UInt32 uType );
}int main( )
{
SysWin32::MessageBox(0, S"Hello world!", S"Greetings", 0);
}
当在托管应用程序中重用现有的非托管代码时,DllImport 属性非常有用。例如,托管应用程序可能需要调用非托管 WIN32 API。下面的代码示例说明此通用方案,此示例将调用 MessageBox(位于 User32.lib 中):#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttributenamespace SysWin32
{
[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption,
unsigned int uType);
}int main( )
{
SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );
}
主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。当调用用户定义的 DLL 中所包含的函数时,有必要将 extern "C" 添加在 DLL 函数声明之前,如下所示:// The function declaration in SampleDLL.h file
extern "C" SAMPLEDLL_API int fnSampleDLL(void);
有关受支持的其他参数值的更多信息,请参见 DllImport。将非结构化参数由托管封送处理为非托管
除使用上述方法外,还可以使用另一种方法将托管参数(来自托管应用程序)封送处理为非托管参数(在非托管 DLL 中)。以下代码示例说明封送处理技术:#using <mscorlib.dll>
using namespace System; // To bring System::String in
using namespace System::Runtime::InteropServices;
// for DllImportAttribute
namespace SysWin32
{
[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
Int32 MessageBox( Int32 hWnd, String* lpText, String* lpCaption,
UInt32 uType );
}int main( )
{
SysWin32::MessageBox(0, S"Hello world!", S"Greetings", 0);
}
解决方案 »
- 比较复杂的一个长SQL,求解
- 【高分求教】关于我不知道怎么描述的问题
- 用C#写一个对oracle的blob字段的insert和上传下载
- 如何在【XmlTextReader】指定路径?
- 求一个正则
- 急!!关于SelectCommand,Insertcommand,DeleteCommand,UpdateCommand的使用,在线等
- 求教:点击右键弹出菜单怎么做啊?
- 如何读取系统事件里的信息呀?
- 介绍一下c#中的RTTI,比如把一个string转换为控件的ID
- 水晶报表,曲线图的线如何加粗(在线等待......)
- ssq.Form1.Dispose(bool)”: 没有找到适合的方法来重写
- 急寻利用goldprinter怎么打印一个分页文档
有了dllimport可以方便的调用win32API
是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息gdi32.dll
gdi32.dll是Windows GDI图形用户界面相关程序,包含的函数用来绘制图像和显示文字kernel32.dll
控制着系统的内存管理、数据的输入输出操作和中断处理微软就是靠这三个模块起家的
Windows SDK只利用这三个模块就能构建基本的Windows程序
http://www.cnblogs.com/howard-queen/archive/2008/07/31/1257127.html
创建Win32 DLL,并在C#里面调用另外,遇到这样的问题,可以先google搜索后,再问具体的。例如怎么调用某个函数等。
user32.dll
gdi32.dll
kernel32.dll