程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> .NET經常調用的外部系統函數舉例說明

.NET經常調用的外部系統函數舉例說明

編輯:關於C#
 

DllImport 屬性的常見用法。第一節討論使用 DllImport 從托管應用程序調用本機代碼的優點。第二節集中討論封送處理和 DllImport 屬性的各個方面。

從托管應用程序調用非托管代碼
當在托管應用程序中重用現有的非托管代碼時,DllImport 屬性非常有用。例如,托管應用程序可能需要調用非托管 WIN32 API。

下面的代碼示例說明此通用方案,此示例將調用 MessageBox(位於 User32.lib 中):

#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttribute

namespace 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);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved