首頁 > 後端開發 > C++ > C# 編譯器如何處理 COM 類型實例化和 Ref 參數傳遞?

C# 編譯器如何處理 COM 類型實例化和 Ref 參數傳遞?

Susan Sarandon
發布: 2025-01-10 17:32:48
原創
297 人瀏覽過

How Does the C# Compiler Handle COM Type Instantiation and Ref Parameter Passing?

在 C# 中偵測 COM 類型

C# 編譯器處理 COM 類型的方式非常獨特。一個顯著的例子是能夠實例化接口,如下例所示:

<code class="language-csharp">Word.Application app = new Word.Application();</code>
登入後複製

儘管 Application 是一個接口,但它可以被實例化。這是透過將呼叫轉換為 Type.GetTypeFromCLSID() 和 Activator.CreateInstance 來實現的。

C# 4 中的另一個獨特行為是能夠將非 ref 參數傳遞給 ref 參數。編譯器會自動新增一個局部變數以透過引用傳遞參數,而不會影響實際值。

為了理解編譯器如何執行這些轉換,我們可以建立一個自訂範例:

<code class="language-csharp">[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
    void Foo(ref int x);
}

class Test
{
    static void Main()
    {
        Dummy dummy = null;
        dummy.Foo(10);
    }
}</code>
登入後複製

這段程式碼將會成功執行,示範如何透過值傳遞 ref 參數。

但是,假設我們想嘗試實例化該介面:

<code class="language-csharp">Dummy dummy = new Dummy();</code>
登入後複製

雖然這段程式碼不會成功執行,但它突顯了需要研究編譯器「魔法」的必要性。為了真正實例化一個接口,我們可以使用 CoClass 屬性:

<code class="language-csharp">[System.Runtime.InteropServices.CoClass(typeof(Test))]
public interface Dummy { }</code>
登入後複製

CoClass 屬性將一個實作類別與介面關聯起來,允許它被實例化為一個具體物件。這種方法通常用於 COM API 需要實例化介面的場景。

以上是C# 編譯器如何處理 COM 類型實例化和 Ref 參數傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板