gpt4 book ai didi

c# - 如何让 CLR 知道从 GAC 选择哪个程序集?

转载 作者:太空宇宙 更新时间:2023-11-03 21:55:13 26 4
gpt4 key购买 nike

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 可能包含具有相同名称(但不同版本和 key )的其他程序集。

那么,如何告诉 CLR 只加载我的程序集而不加载其他同名的程序集?

我很困惑。我知道它受到公钥加密的保护,但我们仍然应该在我们访问它的程序中有一些私钥。请消除我的困惑。

最佳答案

当您在 GAC 中引用程序集时,您必须通过其 strong name 引用它,其名称、版本号、文化(如果提供)以及公钥和数字签名的组合(程序集必须经过签名才能被视为强命名,并且只能将强命名的程序集添加到 GAC)。

如果您引用一个强命名的程序集,那么您已经唯一地标识了您希望使用的程序集。如果您引用的程序集没有强命名,那么该程序集将无法加载到 GAC 中(并且 .Net 运行时也不会检查那里,请参阅 How the Runtime Locates Assemblies)。

如果您正在引用一个强命名程序集(或者实际上是任何程序集)并且想要接受该程序集的多个不同版本(例如 v1.0.0.0 和 v1.0.1.0),或者您想发布更新版本的程序集并允许现有应用程序继续运行而无需重新编译,那么您可以使用 Assembly Binding Redirection .

如果您希望能够引用一个程序集,而不管使用什么 key 对该程序集进行签名,那么您最好根本不对该程序集进行签名(因此不要将其添加到 GAC)。

相信你也可以subscribe to the assembly resolve event ,但是使用程序集绑定(bind)重定向是首选方法,只要它提供所需的行为。

关于c# - 如何让 CLR 知道从 GAC 选择哪个程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com