Подтвердить что ты не робот

Ловушки/ошибки в развертывании ClickOnce/smart-client в .NET.

У меня есть несколько .NET Windows Forms, которые я готов перевести в ClickOnce/сценарий развертывания смарт-клиента. Я читал "нет" это великие уроки, но есть ли подводные камни или "gotchas", о которых я должен знать?

Существует несколько второстепенных приложений, но основное приложение находится в С#, работает 24/7, довольно велико, но меняется только каждые несколько недель. Он также записывается в файл журнала локально и разговаривает с локальными аппаратными устройствами.

4b9b3361

Ответ 1

Вот некоторые из них, о которых я знаю.

  • Невозможно поместить значок на рабочий стол. Теперь вы можете.

  • Я не могу установить для всех пользователей.

  • Мне нужно перепрыгнуть через обручи, чтобы переместить развертывание на другой сервер. Это не проблема, если вы разрабатываете внутренне, и пользователи могут видеть сервер, который вы публикуете, или если вы развертываете его в общедоступной сети, но это не очень удобно, если вам нужно самостоятельно развертывать несколько сайтов клиентов.

  • Поскольку .NET 3.5 SP1 вам больше не нужно подписывать манифест развертывания, что значительно облегчает перенос развертываний на новые серверы.

  • Я не могу установить сборки в GAC. Вы можете обойти это, создав регулярные пакеты установки, которые являются предварительными требованиями к приложению ClickOnce.

Ответ 2

  • При развертывании обновлений встроенный диалог будет выглядеть так, как если бы все приложение было повторно загружено. Фактически загружаются только измененные DLL, а отображаемый индикатор выполнения вводит в заблуждение/неправильный. Не тратьте время на то, чтобы выяснить, почему все сборки перераспределяются только для того, чтобы обнаружить, что они на самом деле нет. Не то, чтобы я сделал это или что-то еще.
  • Когда сертификат, который вы подписали для оригинального манифеста развертывания, истекает, и вы получили новый, вы попали в мир ранений (всем клиентам необходимо будет удалить и переустановить). Подробности находятся у лошади.

Ответ 3

Большинство проблем были устранены, но несколько человек упомянули о невозможности создания ярлыка на рабочем столе. Фактически, вы можете создать ярлык на рабочем столе с помощью Visual Studio 2008 SP1.

Кроме того, если вы не используете последнюю версию Visual Studio, вы всегда можете написать код, чтобы создать ярлык для установленного ярлыка меню запуска.

Ответ 4

У нас было приложение, которое мы собирались развернуть как приложение ClickOnce. Нам потребовался пользователь, чтобы иметь возможность изменять некоторые параметры установки (например, путь развертывания - ИТ хочет обслуживать файлы из своего сетевого ресурса, неизвестные во время сборки). Когда вы меняете какие-либо файлы в своем развертывании, вам нужно пересчитать все хэши и переписать все. Таким образом, если это решение является внутренним, у вас могут не возникнуть проблемы, связанные с сертификатом подписи, но если это для клиентов, вам нужно будет создать модное решение, чтобы обойти эту проблему.

Я слышал, как где-то в недрах интернетов раздавались грохот, что будущая версия ClickOnce удалит часть этой головной боли.

Ответ 5

Одна из проблем с ClickOnce заключается в том, что вы не можете установить в GAC. Это проблема, если вы хотите установить несколько приложений, совместно использующих файлы DLL. Для каждого приложения потребуется локальная копия файлов DLL. Кроме того, отключены несколько пользовательских установок. См. список сравнения Window Installer с ClickOnce.

Ответ 6

Вы не можете без проблем удалять развернутые приложения ClickOnce. Также я думаю, что невозможно добавить параметры в ярлык запуска.

Ответ 7

Есть много вещей, которые вы не можете сделать с приложениями ClickOnce, например, установить ярлык на рабочий стол пользователя или указать, где приложение будет установлено. Для некоторых это расправы.

Также было некоторое время с тех пор, как я использовал его, но есть специальный способ, который вы можете использовать для определения и отображения номера версии/сборки ClickOnce, который отделен от номера версии/сборки приложения. Вам нужно сделать попытку/уловку, и если номер версии/сборки ClickOnce создает исключение, приложение не запускается как приложение, развернутое по ClickOnce (то есть оно выполняется как регулярно скомпилированное приложение или из Visual Studio).

Для приложения, которое просто (то есть не Microsoft Word, а скорее быстрое и грязное приложение, чтобы что-то сделать) и требует много регулярного развертывания, ClickOnce отлично. Но вы скорее быстро попали в стену "О, это не может быть сделано ClickOnce, пожалуйста, выберите MSI или что-то еще).

Ответ 8

У вас будет меньше доступа к системе, чем у обычного приложения .NET.

Это потому, что вы получите более низкий уровень доверия. Подробнее об этом в . Руководство разработчика .NET Framework: развертывание и безопасность ClickOnce.

Моя самая большая проблема заключалась в том, что невозможно шифровать разделы вашего файла конфигурации с помощью машинного ключа, потому что у вас нет доступа к этому ключу (когда вы думаете об этом, имеет смысл защитить этот ключ).

Ответ 9

В случае, если кто-то ссылается на это при поиске, мы обнаружили, что многие клиенты обеспокоены отсутствием безопасности, распространяющей их приложение. Приложение должно быть доступно в общедоступном месте - без какой-либо аутентификации - чтобы оно могло проверять наличие обновлений. Единственным исключением является проверка подлинности Windows NT. Я думаю, Защита приложений ClickOnce объясняет, что я имею в виду.

Значки рабочего стола довольно тривиальны для выполнения кода, и, как уже упоминалось, с 3.5 SP1, запеченный в - так что это уже не проблема.

В xmlSerializer все еще есть ошибка, но в некоторых случаях она не устанавливается должным образом. Легкое обходное решение заключается в том, чтобы вручную добавить этот файл в развертывание. PITA, но это достаточно легко... Это может быть шокирующим, когда ваше развертывание внезапно выходит из строя, хотя...

Ответ 10

Я не знал, что SP1 разрешил вам создавать значок рабочего стола. Вот как мы это делали (теперь это называется "трудный путь" ):

            try
        {
            string company = string.Empty;
            string product = string.Empty;
            if (Attribute.IsDefined(asm, typeof(AssemblyCompanyAttribute)))
            {
                AssemblyCompanyAttribute asCompany = (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyCompanyAttribute));
                company = asCompany.Company;
            }
            if (Attribute.IsDefined(asm, typeof(AssemblyProductAttribute)))
            {
                AssemblyProductAttribute asProduct = (AssemblyProductAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyProductAttribute));
                product = asProduct.Product;
            }
            if (!string.IsNullOrEmpty(company) && !string.IsNullOrEmpty(product))
            {
                string desktopPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                    product + ".appref-ms");
                string shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs),
                    Path.Combine(company, product + ".appref-ms"));
                File.Copy(shortcutPath, desktopPath, true);
            }
        }
        catch 
        {
            // Shortcut could not be created
        }

Ответ 11

Вы не можете установить, находится ли клиент за прокси-сервером, который требует аутентификации.