編譯器警告 (層級 1) CS1699
更新:2007 年 11 月
錯誤訊息
使用命令列選項 "compiler_option" 或適當的專案設定,而不使用 "attribute_name"
為了簽署組件,您需要指定金鑰檔。在 Microsoft Visual C# 2005 之前,您會使用原始程式碼中的 CLR 屬性 (Attribute) 指定金鑰檔。這些屬性現在都已被取代。
從 Microsoft Visual C# 2005 開始,您應該使用 [專案設計工具] 的 [簽署頁面] 或 [組件連結器] 來指定金鑰檔。
[專案設計工具] 的 [簽署頁面] 是偏好的方法;如需詳細資訊,請參閱專案設計工具、簽署頁和管理組件和資訊清單簽署。
HOW TO:使用強式名稱簽署組件會使用下列編譯器選項:
/keyfile (指定強式名稱金鑰檔) (C# 編譯器選項) 取代 AssemblyKeyFileAttribute 屬性。
/keycontainer (指定強式名稱金鑰容器) (C# 編譯器選項) 取代 AssemblyKeyNameAttribute。
/delaysign (延遲為組件簽署) (C# 編譯器選項) 取代 AssemblyDelaySignAttribute。
下列原因導致這些屬性被取代:
因為這些屬性內嵌於編譯器產生的二進位檔中,所以產生安全性問題。他人取得您的二進位檔時,也會取得其中儲存的金鑰。
因為屬性中指定的路徑是相對於目前的工作目錄或輸出目錄 (而工作目錄可在整合式開發環境 (IDE) 中變更),因此會產生可用性問題。因此,在大部分情況下,金鑰檔可能是 ..\\..\\mykey.snk。屬性也使得專案系統難以簽署附屬組件。當使用編譯器選項代替這些屬性時,您可以為金鑰使用完整路徑及檔案名稱,無需在輸出檔案中內嵌屬性。當專案移動時,專案系統和原始程式碼控制系統可以適當管理該完整路徑。專案系統可以維持金鑰檔案的專案相關路徑,同時將完整路徑傳遞給編譯器,其他建置程式可以將適當路徑直接傳遞給編譯器以簡化簽署輸出,而不必使用正確屬性產生原始程式檔。
以 friend 組件使用屬性可能會降低編譯器使用效益。當您使用屬性時,編譯器必須決定是否授與夥伴關係,但是不知道金鑰為何,因此會猜測。編譯結束時,一旦取得正確金鑰資料,編譯器就能確認先前的猜測。以編譯器選項指定金鑰檔時,編譯器可以立即判斷是否要授與夥伴關係。
範例
下列範例會產生 CS1699。若要解決這個問題,請移除屬性並使用 /delaysign 編譯。
// CS1699.cs
// compile with: /target:library
[assembly:System.Reflection.AssemblyDelaySign(true)] // CS1699