天天看點

22.Silverlight使用WebService調用C++,Delphi編寫的DLL檔案

    在Silverlight程式(非Out of Browser模式)中是無法直接調用DLL的,但是很多的計算或者其他應用程式的調用中我們需要用到DLL的加載。比如調用DLL來識别身份證讀卡器傳 輸過來的信号,比如要和某Delph編寫的程式資料通訊等等。本文将簡單的自寫一個DLL檔案,然後通過調用此DLL自定義的一個GetNum函數計算傳 入得兩個參數之和。

        首先我們使用VS2010編寫一個名為IlasLinkDll.dll的C++語言DLL檔案(編寫這個DLL的源碼也會在本章結尾附帶),其内部的關鍵代碼如下:

#ifdef MYLIBDLL 

#define MYLIBDLL extern "C" _declspec(dllimport) 

#else 

#define MYLIBDLL extern "C" _declspec(dllexport) 

#endif 

MYLIBDLL double GetNum(double Anum,double Bnum); 

double GetNum(double Anum,double Bnum) 

return Anum+Bnum; 

        然後我們建立一個名為SLLinkDLl的Silverlight應用程式項目,在SLLinkDLl.Web項目中我們引用 IlasLinkDll.dll檔案,建立一個Wservice.asmx的web服務檔案。在此檔案中編寫以下代碼且添加using System.Runtime.InteropServices;的引用:

[WebMethod] 

public string GetNumber(double A,double B) 

return GetNum(A, B).ToString() ; 

/// <summary> 

/// 擷取到DLL的值 

/// </summary> 

/// <param name="Anumber">數字A</param> 

/// <param name="Bnumber">數字B</param> 

/// <returns></returns> 

[DllImport("IlasLinkDll.dll", CharSet = CharSet.Ansi, EntryPoint = "GetNum", ExactSpelling = false)] 

public static extern double GetNum(double Anumber, double Bnumber); 

public MainPage() 

InitializeComponent(); 

//建立webService代理類的對象執行個體 

WServiceSoapClient sclient=new WServiceSoapClient(); 

//調用GetNumber方法,并傳遞兩個參數 

sclient.GetNumberAsync(500,23); 

sclient.GetNumberCompleted += new EventHandler<GetNumberCompletedEventArgs>(sclient_GetNumberCompleted); 

void sclient_GetNumberCompleted(object sender, GetNumberCompletedEventArgs e) 

//結果将為523 

MessageBox.Show(e.Result); 

        通過上面的代碼我們傳入500和23兩個參數。然後得到結果為523的彈出視窗。下面我們看一下加載DLL的DllImport特性的參數使用方法:

   a、CallingConvention 參數訓示入口點的調用約定。如果未指定 CallingConvention,則使用預設值 CallingConvention.Winapi。 

   b、CharSet 參數訓示用在入口點中的字元集。如果未指定 CharSet,則使用預設值 CharSet.Auto。 

   c、EntryPoint 參數給出 dll 中入口點的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。 

   d、ExactSpelling 參數訓示 EntryPoint 是否必須與訓示的入口點的拼寫完全比對。如果未指定 ExactSpelling,則使用預設值 false。 

   e、PreserveSig 參數訓示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為一個具有 HRESULT 傳回值和該傳回值的一個名為 retval 的附加輸出參數的簽名。如果未指定 PreserveSig,則使用預設值 true。 

   f、SetLastError 參數訓示方法是否保留 Win32"上一錯誤"。如果未指定 SetLastError,則使用預設值 false。 

        Tip:筆者在某一個項目中遇到無論指明什麼EntryPoint入口點和CharSet字元集都無法加載一個第三方DLL檔案時,就直接自己使用C++ 編寫了一個DLL檔案來加載這個C#中無法識别加載的第三方DLL,然後在C#中調用自己編寫的DLL檔案解決了問題。

本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/821970