1


所以基本上我们有一个强名称(强签名)程序集 x.dll,它由我们的组件之一 App.exe 使用。程序集的签名密钥在我们的存储库中,并且程序集是通过书面形式签署的

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFileAttribute(@"..\..\xxx.snk")]
[assembly: AssemblyKeyName("")]

该程序集应该由一些安装通用软件包的安装程序放入 GAC,我们将其命名为 common.msi。但是我们的组件本身是由 App.msi 安装的。一起部署时,一切正常。但是当对 App.msi 进行更改时,那些与 x.dll 完全无关的,并且重新部署 App.msi,App.exe 无法找到 x.dll。请注意,不会对 x.dll 进行任何更改。但是,当也部署 common.msi 时,一切正常。所以我猜肯定存在构建版本或其他东西的问题,或者我一无所知的清单。有什么明显的我做错了吗?是不是可以单独部署组件而不触摸它,除非它被更改并且每次使用它的组件发生更改时都不会重新部署它?谢谢。

编辑:将程序集放入 GAC 是一项要求(我对此无能为力)

4

1 回答 1

1

为什么要将它安装到 GAC 中?不要那样做。

您的问题“需要将程序集重新部署到 GAC”的标题是错误的。您所写的任何内容都没有暗示程序集需要在 GAC 中。


编辑 - 一些附加信息。

如果你想检查依赖关系,你可以使用 Redgate 的反射器来检查一个程序集,比如你的 App.exe,以确定它依赖和需要哪些其他程序集。这些依赖项将包括版本号。

我不知道命令行中的工具只会发出汇编信息。也许有一个。缺少这个,我写了一个工具来做到这一点,像这样:

    public static void Main(string[] args)
    {
        if ((((args == null) || (args.Length != 1)) || (args[0] == "-?")) || (args[0] == "-h"))
        {
            Usage();
        }
        else
        {
            try
            {
                Console.WriteLine(Assembly.LoadFrom(args[0]).FullName.ToString());
            }
            catch (Exception exception)
            {
                Console.WriteLine("Exception: {0}", exception.ToString());
                Usage();
            }
        }
    }

您可以在 App.exe 和 x.dll 上运行此工具,以确定嵌入到每个程序集中的确切强名称,包括版本号。

这可能有助于您深入了解为什么事情没有按预期工作。

即使 GAC 中有一个版本的 x.dll,也没有必要让 App.exe 等任意应用程序使用该版本的 DLL。该应用程序可以在本地目录中安装它自己的 dll 版本。

于 2010-12-28T13:58:16.390 回答