溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中怎么聲明一個COM接口

發(fā)布時間:2021-07-08 14:59:34 來源:億速云 閱讀:229 作者:Leah 欄目:編程語言

這篇文章給大家介紹C#中怎么聲明一個COM接口,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

COM 接口在 C# 中表示為具有 ComImport 和 Guid 屬性的接口。它不能在其基接口列表中包含任何接口,而且必須按照方法在 COM 接口中出現(xiàn)的順序聲明接口成員函數(shù)。

C#聲明COM接口必須包含其基接口的所有成員的聲明,IUnknown 和 IDispatch 的成員除外(.NET 框架將自動添加這些成員)。從 IDispatch 派生的 COM 接口必須用 InterfaceType 屬性予以標記。

從 C# 代碼調(diào)用 COM 接口方法時,公共語言運行庫必須封送與 COM 對象之間傳遞的參數(shù)和返回值。對于每個 .NET 框架類型均有一個默認類型,公共語言運行庫將使用此默認類型在 COM 調(diào)用間進行封送處理時封送。例如,C# 字符串值的默認封送處理是封送到本機類型 LPTSTR(指向 TCHAR 字符緩沖區(qū)的指針)??梢栽贑#聲明COM接口中使用 MarshalAs 屬性重寫默認封送處理。

在 COM 中,返回成功或失敗的常用方法是返回一個 HRESULT,并在 MIDL 中有一個標記為"retval"、用于方法的實際返回值的 out 參數(shù)。在 C#(和 .NET 框架)中,指示已經(jīng)發(fā)生錯誤的標準方法是引發(fā)異常。

默認情況下,.NET 框架為由其調(diào)用的 COM 接口方法在兩種異常處理類型之間提供自動映射。返回值更改為標記為 retval 的參數(shù)的簽名(如果方法沒有標記為 retval 的參數(shù),則為 void)。標記為 retval 的參數(shù)從方法的參數(shù)列表中剝離。任何非成功返回值都將導(dǎo)致引發(fā) System.COMException 異常。此示例顯示用 MIDL 聲明的 COM 接口以及用 C# 聲明的同一接口(注意這些方法使用 COM 錯誤處理方法)。

下面是一個使用C# 映射媒體播放機COM 對象的程序。

  1. using System;  

  2. using System.Runtime.InteropServices;  

  3. namespace QuartzTypeLib  

  4. {  

  5. //聲明一個COM接口 IMediaControl,此接口來源于媒體播放機COM類  

  6. [Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"),  

  7. InterfaceType(ComInterfaceType.InterfaceIsDual)]  

  8. interface IMediaControl  

  9. { //列出接口成員  

  10. void Run();  

  11. void Pause();  

  12. void Stop();  

  13. void GetState( [In] int msTimeout, [Out] out int pfs);  

  14. void RenderFile(  

  15. [In, MarshalAs(UnmanagedType.BStr)] string strFilename);  

  16. void AddSourceFilter(  

  17. [In, MarshalAs(UnmanagedType.BStr)] string strFilename,  

  18. [Out, MarshalAs(UnmanagedType.Interface)]  

  19. out object ppUnk);  

  20. [return: MarshalAs(UnmanagedType.Interface)]  

  21. object FilterCollection();  

  22. [return: MarshalAs(UnmanagedType.Interface)]  

  23. object RegFilterCollection();  

  24. void StopWhenReady();  

  25. }  

  26. //聲明一個COM類:  

  27. [ComImport, Guid("E436EBB3-524F-11CE-9F53-0020AF0BA770")]  

  28. class FilgraphManager //此類不能再繼承其它基類或接口  

  29. {  

  30. //這里不能有任何代碼 ,系統(tǒng)自動增加一個缺省的構(gòu)造函數(shù)  

  31. }  

  32. }  

  33. class MainClass  

  34. {  

  35. public static void Main(string[] args)  

  36. {  

  37. //命令行參數(shù):  

  38. if (args.Length != 1)  

  39. {  

  40. DisplayUsage();  

  41. return;  

  42. }  

  43. String filename = args[0];  

  44. if (filename.Equals("/?"))  

  45. {  

  46. DisplayUsage();  

  47. return;  

  48. }  

  49. // 聲明FilgraphManager的實類對象:  

  50. QuartzTypeLib.FilgraphManager graphManager =new QuartzTypeLib.FilgraphManager();  

  51. //聲明IMediaControl的實類對象::  

  52. QuartzTypeLib.IMediaControl mc =(QuartzTypeLib.IMediaControl)graphManager;  

  53. // 調(diào)用COM的方法:  

  54. mc.RenderFile(filename);  

  55. //運行文件.  

  56. mc.Run();  

  57. //暫借停.  

  58. Console.WriteLine("Press Enter to continue.");  

  59. Console.ReadLine();  

  60. }  

  61. private static void DisplayUsage()  

  62. { // 顯示  

  63. Console.WriteLine("媒體播放機: 播放 AVI 文件.");  

  64. Console.WriteLine("使用方法: VIDEOPLAYER.EXE 文件名");  

  65. }  

  66. }  

  67. 運行示例:  

  68. 若要顯示影片示例 Clock.avi,請使用以下命令:  

  69. interop2 %windir%\clock.avi  

  70. 這將在屏幕上顯示影片,直到按 ENTER 鍵停止。  

  71. 在 .NET 框架程序中通過DllImport使用 Win32 API  

  72. .NET 框架程序可以通過靜態(tài) DLL 入口點的方式來訪問本機代碼庫。
    DllImport 屬性用于指定包含外部方法的實現(xiàn)的dll 位置  

  73. DllImport 屬性定義如下:  

  74. namespace System.Runtime.InteropServices  

  75. {  

  76. [AttributeUsage(AttributeTargets.Method)]  

  77. public class DllImportAttribute: System.Attribute  

  78. {  

  79. public DllImportAttribute(string dllName) {...}  

  80. public CallingConvention CallingConvention;  

  81. public CharSet CharSet;  

  82. public string EntryPoint;  

  83. public bool ExactSpelling;  

  84. public bool PreserveSig;  

  85. public bool SetLastError;  

  86. public string Value { get {...} }  

  87. }  

關(guān)于C#中怎么聲明一個COM接口就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI