1
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
        }
    }
}

このプログラムはShapes、GAC にあるアセンブリを使用しています。アセンブリが 1 つしかない場合は問題ありません。ただし、GAC には、同じ名前 (ただし、バージョンとキーは異なる) の他のアセンブリが含まれている場合があります。

では、同じ名前を持つ他のアセンブリではなく、私のアセンブリのみをロードするように CLR に指示するにはどうすればよいでしょうか?

よくわかりません。公開鍵暗号化によって保護されていることは知っていますが、アクセス元のプログラムには秘密鍵が必要です。私の混乱を解消してください。

4

3 に答える 3

3

GACでアセンブリを参照するときは、その厳密な名前、名前、バージョン番号、カルチャ(提供されている場合)、公開鍵、およびデジタル署名(アセンブリは、厳密に名前が付けられていると見なされるように署名する必要があります)の組み合わせで参照する必要があります。厳密に名前が付けられたアセンブリのみをGACに追加できます)。

厳密に名前が付けられたアセンブリを参照する場合は、使用するアセンブリをすでに一意に識別しています。厳密に名前が付けられていないアセンブリを参照している場合、そのアセンブリをGACにロードすることはできません(.Netランタイムはそこでチェックしません。ランタイムがアセンブリを見つける方法を参照してください)。

厳密に名前が付けられたアセンブリ(または実際には任意のアセンブリ)を参照していて、そのアセンブリの複数の異なるバージョン(v1.0.0.0やv1.0.1.0など)を受け入れたい場合、または新しいバージョンのアセンブリをリリースしたい場合アセンブリを作成し、既存のアプリケーションを再コンパイルせずに機能し続けることができるようにすると、アセンブリバインディングリダイレクトを使用できます。

そのアセンブリに署名するために使用されるキーに関係なくアセンブリを参照できるようにする場合は、そのアセンブリにまったく署名しない(したがって、GACに追加しない)ことをお勧めします。

アセンブリ解決イベントをサブスクライブすることもできると思いますが、目的の動作を提供する限り、アセンブリバインディングリダイレクトを使用することをお勧めします。

于 2012-09-25T17:29:16.337 に答える
1

コンパイル時に、使用する正確なバージョンを指定できます。これは、実行時にロードされるバージョンです。Visual Studio を使用している場合、参照のプロパティにはバージョン番号と、正確なバージョン番号を読み込む必要があるかどうかを示すフラグが含まれます。

于 2012-09-25T17:21:21.710 に答える
0

アセンブリは、その名前、公開キー トークン、およびバージョンによって定義されます。参照を作成するときは、具体的にこれらの値をそれぞれ示すことができます。

于 2012-09-25T17:22:25.073 に答える