基于C#的接口基礎(chǔ)教程之六(2)_.Net教程
推薦:基于C#的接口基礎(chǔ)教程之五 第五節(jié)、實(shí)現(xiàn)接口 1、顯式實(shí)現(xiàn)接口成員 為了實(shí)現(xiàn)接口,類可以定義顯式接口成員執(zhí)行體(Explicit interface member implementations)。顯式接口成員執(zhí)行體可以是一個(gè)方法、一個(gè)
創(chuàng)建 COM 對(duì)象
COM coclass 在 C# 中表示為具有無參數(shù)構(gòu)造函數(shù)的類。使用 new 運(yùn)算符創(chuàng)建該類的實(shí)例等效于在 C# 中調(diào)用 CoCreateInstance。使用以上定義的類,就可以很容易地實(shí)例化此類:
class MainClass
{
public static void Main()
{
FilgraphManager filg = new FilgraphManager();
}
}
聲明 COM 接口
COM 接口在 C# 中表示為具有 ComImport 和 Guid 屬性的接口。它不能在其基接口列表中包含任何接口,而且必須按照方法在 COM 接口中出現(xiàn)的順序聲明接口成員函數(shù)。
在 C# 中聲明的 COM 接口必須包含其基接口的所有成員的聲明,IUnknown 和 IDispatch 的成員除外(.NET 框架將自動(dòng)添加這些成員)。從 IDispatch 派生的 COM 接口必須用 InterfaceType 屬性予以標(biāo)記。
從 C# 代碼調(diào)用 COM 接口方法時(shí),公共語言運(yùn)行庫必須封送與 COM 對(duì)象之間傳遞的參數(shù)和返回值。對(duì)于每個(gè) .NET 框架類型均有一個(gè)默認(rèn)類型,公共語言運(yùn)行庫將使用此默認(rèn)類型在 COM 調(diào)用間進(jìn)行封送處理時(shí)封送。例如,C# 字符串值的默認(rèn)封送處理是封送到本機(jī)類型 LPTSTR(指向 TCHAR 字符緩沖區(qū)的指針)。可以在 COM 接口的 C# 聲明中使用 MarshalAs 屬性重寫默認(rèn)封送處理。
在 COM 中,返回成功或失敗的常用方法是返回一個(gè) HRESULT,并在 MIDL 中有一個(gè)標(biāo)記為"retval"、用于方法的實(shí)際返回值的 out 參數(shù)。在 C#(和 .NET 框架)中,指示已經(jīng)發(fā)生錯(cuò)誤的標(biāo)準(zhǔn)方法是引發(fā)異常。
默認(rèn)情況下,.NET 框架為由其調(diào)用的 COM 接口方法在兩種異常處理類型之間提供自動(dòng)映射。
返回值更改為標(biāo)記為 retval 的參數(shù)的簽名(如果方法沒有標(biāo)記為 retval 的參數(shù),則為 void)。
標(biāo)記為 retval 的參數(shù)從方法的參數(shù)列表中剝離。
任何非成功返回值都將導(dǎo)致引發(fā) System.COMException 異常。
此示例顯示用 MIDL 聲明的 COM 接口以及用 C# 聲明的同一接口(注意這些方法使用 COM 錯(cuò)誤處理方法)。
下面是接口轉(zhuǎn)換的C#程序:
using System.Runtime.InteropServices;
// 聲明一個(gè)COM接口 IMediaControl
[Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"),
InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface IMediaControl // 這里不能列出任何基接口
{
void Run();
void Pause();
void Stop();
void GetState( [In] int msTimeout, [Out] out int pfs);
void RenderFile(
[In, MarshalAs(UnmanagedType.BStr)] string strFilename);
void AddSourceFilter(
[In, MarshalAs(UnmanagedType.BStr)] string strFilename,
[Out, MarshalAs(UnmanagedType.Interface)] out object ppUnk);
[return : MarshalAs(UnmanagedType.Interface)]
object FilterCollection();
[return : MarshalAs(UnmanagedType.Interface)]
object RegFilterCollection();
void StopWhenReady();
}
若要防止 HRESULT 翻譯為 COMException,請(qǐng)?jiān)?C# 聲明中將 PreserveSig(true) 屬性附加到方法。
下面是一個(gè)使用C# 映射媒體播放機(jī)COM 對(duì)象的程序。
分享:基于C#的接口基礎(chǔ)教程之四 第四節(jié)、訪問接口 對(duì)接口成員的訪問 對(duì)接口方法的調(diào)用和采用索引指示器訪問的規(guī)則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那么底層成員將覆蓋同
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- asp.net網(wǎng)站RSS功能實(shí)例代碼
- 復(fù)雜ASP.NET服務(wù)器控件調(diào)整小技巧
- ASP.NET 2.0中構(gòu)造個(gè)性化網(wǎng)頁
- 捕捉WPF應(yīng)用程序中XAML代碼解析異常
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- VB.NET 中刪除DataGridView中所選行的小例子
- 10個(gè)ASP.NET編程技巧
- 關(guān)于.NET/C#/WCF/WPF 打造IP網(wǎng)絡(luò)智能視頻監(jiān)控系統(tǒng)的介紹
- 看看一個(gè).net版對(duì)話框控件
- ASP.NET中實(shí)現(xiàn)模板頁
- 相關(guān)鏈接:
- 教程說明:
.Net教程-基于C#的接口基礎(chǔ)教程之六(2)
。