延遲簽署組件

組織可能會有開發人員無法每日存取的嚴密保護金鑰組。 公開金鑰經常都可以使用,但只有少數人才能存取私密金鑰。 在以強式名稱開發組件時,每個參考強式名稱目標組件的組件都包含用來指定目標組件的強式名稱的公開金鑰語彙基元。 這需要可在開發程序期間使用公開金鑰。

您可以在建置階段中使用延遲或部份簽署,以便在可攜式執行檔 (PE) 中保留強式名稱簽章的空間,但延後到之後的某個階段 (通常是就在傳送組件之前) 才實際簽署。

若要延遲簽署組件:

  1. 從將執行最終簽署的組織取得金鑰組的公開金鑰部分。 此金鑰的格式通常是 .snk 檔案,這可以使用 Windows SDK 提供的強式名稱工具 (Sn.exe) 建立。

  2. 使用來自 System.Reflection 的兩個自訂屬性為組件的原始碼加上註解:

    例如:

    [assembly:AssemblyKeyFileAttribute("myKey.snk")];
    [assembly:AssemblyDelaySignAttribute(true)];
    
    [assembly:AssemblyKeyFileAttribute("myKey.snk")]
    [assembly:AssemblyDelaySignAttribute(true)]
    
    <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
    <Assembly:AssemblyDelaySignAttribute(True)>
    
  3. 編譯器會將公開金鑰插入到組件資訊清單,並在 PE 檔中保留完整強式名稱簽章的空間。 在建置組件時必須儲存真正的公開金鑰,以便參考這個組件的其他組件可以取得金鑰,儲存在它們自己的組件參考。

  4. 因為組件沒有有效的強式名稱簽章,所以該簽章的驗證作業必須關閉。 您可以使用 [-Vr] 選項搭配強式名稱工具完成此作業。

    下列範例會關閉 myAssembly.dll 組件的驗證。

    sn -Vr myAssembly.dll
    

    若要在您無法在執行強式名稱工具的平台上關閉驗證,例如 Advanced RISC Machine (ARM) 微處理器,請使用 [-Vk] 選項來建立登錄檔。 將登錄檔匯入到您要關閉驗證的電腦上的登錄。 下列範例將建立 myAssembly.dll 的登錄檔。

    sn -Vk myRegFile.reg myAssembly.dll
    

    使用 [-Vr] 或 [-Vk] 選項時,您可以選擇性地包含測試金鑰簽署的 .snk 檔案。

    警告

    請勿依賴強式名稱提供安全性。 強式名稱僅提供唯一識別。

    注意

    如果您在 64 位元電腦上,使用 Visual Studio 進行開發期間使用延遲簽署,並且編譯任何 CPU 的組件,您可能要套用 -Vr 選項兩次。 (在 Visual Studio 中,任何 CPU平台目標建置屬性的值,當您從命令列編譯時,它是預設值。)若要從命令列或檔案總管執行您的應用程式,請使用 64 位元版本的 Sn.exe (強式名稱工具) 套用 -Vr 選項給組件。 若要在設計階段將組件載入到 Visual Studio (例如,如果組件包含您應用程式中其他組件使用的元件),請使用 32 位元版本的強式名稱工具。 這是因為當組件是從命令列執行時,just-in-time (JIT) 編譯器會將組件編譯為 64 位元原生程式碼,而當載入到設計階段環境時,編譯為 32 位元原生程式碼。

  5. 稍後,通常就在傳送之前,您會將組件送出給貴組織的簽署授權單位,以便使用強式名稱工具的 [-R] 選項進行實際的強式名稱簽署。

    下列範例會使用 sgKey.snk 金鑰組,以強式名稱簽署 myAssembly.dll 組件。

    sn -R myAssembly.dll sgKey.snk
    

另請參閱