C#中不僅支持
現在部署的任何COM 組件都可以在接口轉換中使用
特別是
使用ComImport引用COM組件
COM Interop 提供對現有 COM 組件的訪問
創建 COM 類包裝
要使 C# 代碼引用COM 對象和接口
TlbImp 執行下列轉換
檢查 TlbImp 輸出的一種很好的方法是運行
雖然 TlbImp 是將 COM 定義轉換為 C# 的首選方法
執行 COM 映射需要理解的主要屬性包括
聲明 COM coclass
COM coclass 在 C# 中表示為類
以下示例在 C# 中聲明一個 coclass
// 聲明一個COM類 FilgraphManager
[ComImport
class FilgraphManager
{ }
C# 編譯器將添加一個無參數構造函數
創建 COM 對象
COM coclass 在 C# 中表示為具有無參數構造函數的類
class MainClass
{
public static void Main()
{
FilgraphManager filg = new FilgraphManager();
}
}
聲明 COM 接口
COM 接口在 C# 中表示為具有 ComImport 和 Guid 屬性的接口
在 C# 中聲明的 COM 接口必須包含其基接口的所有成員的聲明
從 C# 代碼調用 COM 接口方法時
在 COM 中
默認情況下
返回值更改為標記為 retval 的參數的簽名(如果方法沒有標記為 retval 的參數
標記為 retval 的參數從方法的參數列表中剝離
任何非成功返回值都將導致引發 System
此示例顯示用 MIDL 聲明的 COM 接口以及用 C# 聲明的同一接口(注意這些方法使用 COM 錯誤處理方法)
下面是接口轉換的C#程序
using System
// 聲明一個COM接口 IMediaControl
[Guid(
InterfaceType(ComInterfaceType
interface IMediaControl // 這裡不能列出任何基接口
{
void Run();
void Pause();
void Stop();
void GetState( [In] int msTimeout
void RenderFile(
[In
void AddSourceFilter(
[In
[Out
[return : MarshalAs(UnmanagedType
object FilterCollection();
[return : MarshalAs(UnmanagedType
object RegFilterCollection();
void StopWhenReady();
}
若要防止 HRESULT 翻譯為 COMException
下面是一個使用C# 映射媒體播放機COM 對象的程序
程序清單
using System;
using System
namespace QuartzTypeLib
{
//聲明一個COM接口 IMediaControl
[Guid(
InterfaceType(ComInterfaceType
interface IMediaControl
{ //列出接口成員
void Run();
void Pause();
void Stop();
void GetState( [In] int msTimeout
void RenderFile(
[In
void AddSourceFilter(
[In
[Out
out object ppUnk);
[return: MarshalAs(UnmanagedType
object FilterCollection();
[return: MarshalAs(UnmanagedType
object RegFilterCollection();
void StopWhenReady();
}
//聲明一個COM類:
[ComImport
class FilgraphManager //此類不能再繼承其它基類或接口
{
//這裡不能有任何代碼
}
}
class MainClass
{
public static void Main(string[] args)
{
//命令行參數:
if (args
{
DisplayUsage();
return;
}
String filename = args[
if (filename
{
DisplayUsage();
return;
}
// 聲明FilgraphManager的實類對象
QuartzTypeLib
//聲明IMediaControl的實類對象
QuartzTypeLib
// 調用COM的方法
mc
//運行文件
mc
//暫借停
Console
Console
}
private static void DisplayUsage()
{ // 顯示
Console
Console
}
}
運行示例
若要顯示影片示例 Clock
interop
這將在屏幕上顯示影片
在
DllImport 屬性定義如下
namespace System
{
[AttributeUsage(AttributeTargets
public class DllImportAttribute: System
{
public DllImportAttribute(string dllName) {
public CallingConvention CallingConvention;
public CharSet CharSet;
public string EntryPoint;
public bool ExactSpelling;
public bool PreserveSig;
public bool SetLastError;
public string Value { get {
}
}
說明
a
b
c
d
e
f
下面是 C# 調用 Win
using System;
using System
class MainApp
{ //通過DllImport引用user
[DllImport(
public static extern int MessageBox(int hWnd
public static void Main()
{
MessageBox(
}
}
面向對象的編程語言幾乎都用到了抽象類這一概念
From:http://tw.wingwit.com/Article/program/net/201311/12116.html