C# 中的 extern 關鍵字

Muhammad Zeeshan 2023年1月30日 2022年7月18日
  1. C# 中的 extern 關鍵字
  2. extern 如何在 C# 中工作
C# 中的 extern 關鍵字

在今天的文章中,我們將學習 C# 中 extern 關鍵字的功能。

C# 中的 extern 關鍵字

使用 extern 修飾符宣告外部實現的方法。當利用 Interop 服務呼叫非託管程式碼時,extern 修飾符通常與 DllImport 屬性一起使用。

在這種情況下,有必要將方法定義為靜態

extern 關鍵字也可用於構造外部程式集別名,允許在單個程式集中引用同一元件的多個版本。

同時使用 abstractextern 修飾符來更改單個成員是不可接受的。當你使用 abstract 修飾符時,它表示方法實現未在類中提供,而當你使用 extern 修飾符時,這表明方法實現位於 C# 程式碼之外。

extern 如何在 C# 中工作

如果方法的宣告包含 extern 修飾符,則同意將其視為外部方法。外部方法的實現通常發生在 C# 之外並使用不同的程式語言。

由於外部方法宣告不包括任何實際實現,因此外部方法的方法體包含單個分號。外部方法可能不是通用的。

extern 修飾符通常與 DllImport 屬性結合使用。這種組合允許 Dynamic Link LibrariesDLLs 合併來自外部模組的方法。

執行環境有可能支援其他技術,從而可以提供外部方法的實現。當外部方法具有 DllImport 屬性時,方法宣告還必須具有 static 修飾符才能正常執行。

語法:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

例子:

在這個例子中,我們可以使用 extern 別名來匯入功能,然後適當地使用該功能。

使用外部別名時,單個完全限定名稱可能引用兩種型別。當兩個實體具有相同的完全限定名稱時,表明 namespace 和型別 names 是相同的。

只有當這兩種型別來自兩個單獨的程式集時,才會發生這種情況。

  1. 第一個編譯成 info1.dll 的庫

    namespace information
    {
      public class info {}
    }
    
  2. 第二個庫編譯為 info2.dll

    namespace information
    {
      public class info {}
    }
    
  3. 以下是使用 info1.dllinfo2.dll 檔案的應用程式示例。

    using info;
    class Test
    {
      static void Main()
      {
    	information i = new information();
      }
    }
    
  1. 由於 information 不清晰,無法編譯應用程式。在這種情況下,可以使用 extern 別名來清除不確定性。

    你首先需要更改應用程式使用的 .csproj 檔案,併為每個引用指定其不同的別名

    <ItemGroup>
    <Reference Include="info1">
    <Aliases>i1</Aliases>
    </Reference>
    <Reference Include="info2">
    <Aliases>i2</Aliases>
    </Reference>
    </ItemGroup>
    
  2. 使用 extern 別名指令作為該過程的最後一步。

    extern alias i1;
    extern alias i2;
    
    class Test
    {
      static void Main()
      {
    	i1.information.info first = new i1.information.info();
    	i2.information.info second = new i2.information.info();
      }
    }
    
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn