在 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中文網其他相關文章!