Сборка должна быть повторно развернута в GAC каждый раз, когда изменяется его пользовательское приложение. - PullRequest
1 голос
/ 28 декабря 2010


Так что в основном у нас есть сборка 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

1 Ответ

1 голос
/ 28 декабря 2010

Почему вы устанавливаете его в GAC? Не делай этого.

Название вашего вопроса "Сборка должна быть перенесена в GAC" просто неверно. Ничто из того, что вы написали, не подразумевает, что сборка должна быть в GAC.


РЕДАКТИРОВАТЬ - некоторая дополнительная информация.

Если вы хотите проверить зависимости, вы можете использовать Redgate Reflector для проверки сборки, например, вашего 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.

...