簡體   English   中英

如何讓CLR知道從GAC中選擇哪個程序集?

[英]How to let CLR know which assembly to pick from GAC?

using System;
using System.Collections.Generic;
using System.Text;
using Shapes;

namespace ShapeUser
{
    public class ShapeUser
    {
        public static void Main() 
        {
            Circle c = new Circle(1.0F);
            Console.WriteLine("Area of Circle(1.0) is {0}", c.Area());
            Console.ReadKey(); // press a key to exit program
        }
    }
}

該程序正在使用GAC中的Shapes程序集。 如果只有一個組件,那就好了。 但是,GAC可能包含具有相同名稱(但版本和密鑰不同)的其他程序集。

那么,如何告訴CLR只加載我的程序集而不是其他具有相同名稱的程序集?

我糊塗了。 我知道它受到公鑰加密的保護,但我們仍然應該在我們訪問它的程序中使用一些私鑰。 請清除我的困惑。

在GAC中引用程序集時, 必須通過其強名稱 ,名稱,版本號,文化(如果提供)以及公鑰和數字簽名的組合來引用它(程序集必須簽名才能被視為強名稱,並且只有強名稱的程序集才可以添加到GAC中。

如果引用強名稱程序集,那么您已經唯一地標識了要使用的程序集。 如果您正在引用一個沒有強命名的程序集,那么該程序集無法加載到GAC中(並且.Net運行時無論如何也不會檢查該程序集,請參閱運行時如何查找程序集 )。

如果您正在引用強名稱程序集(或實際上是任何程序集)並希望接受該程序集的多個不同版本(例如v1.0.0.0和v1.0.1.0),或者您想要發布更新版本的程序集匯編並允許現有應用程序繼續運行而無需重新編譯,然后您可以使用程序集綁定重定向

如果您希望能夠引用程序集而不管用於簽署該程序集的密鑰,那么最好不要簽署該程序集(因此不將其添加到GAC)。

我相信您也可以訂閱程序集解析事件 ,但是使用程序集綁定重定向是首選方法,只要它提供所需的行為即可。

編譯時,您可以指定要使用的確切版本。 這是將在執行時加載的版本。 如果您使用的是Visual Studio,則引用的屬性將包含版本號,以及一個標記,指出是否必須加載確切的版本號。

程序集由其名稱,公鑰標記和版本定義。 創建引用時,您可以是特定的並指示每個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM