Отладка классов настраиваемого установщика C#

Я написал класс установки, который расширяет программу установки и переопределяет afterInstall, но я получаю исключение с нулевым указателем. Как я могу отладить свой класс?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
0
28 711
14

Ответы 14

создайте виртуальную машину, установите Visual Studio, сделайте ее копию (или создайте другой виртуальный жесткий диск) и запустите установщик в отладчике под виртуальной машиной.

Я бы так и поступил (но я не эксперт).

Объедините это с советом System.Diagnostics.Debugger.Break (), и жизнь станет действительно хорошей в создании отлаживаемых репродукций.

stephbu 11.11.2008 09:49

прикрепите процесс установки к Visual Studio в Debug-> Processes-> Attach или CTRL + ALT + P установите точку останова, и вы сможете перейти

И каков процесс установки (название?)

Sandeep 17.07.2015 01:31

Что-то, что удобно для трудноотлаживаемых участков кода, - это

System.Diagnostics.Debugger.Break()

Выдает точку останова, обнаруженную любым установленным отладчиком (VStudio, WinDbg, удаленный отладчик и т. д.).

Используйте его для отладки действительно сложных областей, где обычное нажатие F5 + Go или «Присоединить к процессу» сложно или невозможно выполнить, некоторые примеры включают:

  • кратковременные процессы
  • чувствительные ко времени процессы
  • разбиение на порожденные подпроцессы
  • установщики
  • остановка / запуск службы
  • распределенные системы

Не сработало для меня, не выполнив сначала System.Diagnostics.Debugger.Launch ()

Mark Lakata 14.02.2012 02:23

Привет, Марк - Break пытается запустить любой отладчик, указанный в ключах реестра автоматической отладки. Я могу представить, что если не указан отладчик, он ничего не сделает - затем попытайтесь его прикрепить - ничего не получится. Где, как, запустив его явно, вы присоединяете этот экземпляр. msdn.microsoft.com/en-us/library/windows/desktop/… имеет более подробную информацию. Был скрытый диалог для указания отладчика по умолчанию - на данный момент я ускользает.

stephbu 14.02.2012 03:55

Кроме того, не забудьте собрать установщик в режиме отладки, чтобы файлы отладки были там. И еще мне пришлось отключить "Включить только мой код". Работал как шарм! Спасибо!

JohnnyFun 17.09.2016 16:05

Я использую EventLog.WriteEntry («источник», «сообщение») и проверяю журнал событий при установке. Может не оптимально, но у меня работает :)

Я бы сделал то же самое ... напишите в журнал и проверьте журнал, как только приложение завершит выполнение, так что получите четкую картину того, что происходит ... Утверждая тот факт, что вы достаточно педантичны!

IbrarMumtaz 06.05.2010 01:41

Лучший способ, который я нашел, - это написать модульный тест, а также создать новый и инициализировать свой класс установщика из вашего модульного теста:

[TestClass] public class InstallerTest {
[TestMethod]
public void InstallTest() {
  // substitute with your installer component here
  DataWarehouseInstall installer = new DataWarehouseInstall();

  string assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

  string installLogFilePath = Path.Combine(assemblyDirectory, "install.log");
  installer.Context = new System.Configuration.Install.InstallContext(installLogFilePath, null);      

  // Refactor to set any parameters for your installer here
  installer.Context.Parameters.Add("Server", ".");
  //installer.Context.Parameters.Add("User", "");
  //installer.Context.Parameters.Add("Password", "");
  installer.Context.Parameters.Add("DatabaseName", "MyDatabaseInstallMsiTest");
  //installer.Context.Parameters.Add("DatabasePath", "");

  // Our test isn't injecting any save state so we give a default instance for the stateSaver
  installer.Install(new Hashtable());
} }

По крайней мере, тогда он лучше использует инструменты IDE. Это особенно полезно для очень крупных установщиков с МНОЖЕСТВОМ компонентов. Затем вы также можете создавать упорядоченные модульные тесты и запускать их последовательно, чтобы имитировать работу установщика во время отладки или автоматизированных сборок.

Другим советом были бы общие принципы программного обеспечения SOLID / GRASS ... разработка в аккуратных / тонких слоях, сохраняя вашу фактическую логику установщика "настраиваемых действий" очень простой и вместо этого вызывайте любые повторно используемые материалы API, которые у вас есть, которые специфичны для вашего установщика (ов). '' ( , как мы привыкли к разработке пользовательского интерфейса. (В любом случае установщик - это просто еще один пользовательский интерфейс.) Это особенно важно, если ваша цель - сделать определенный пользовательский интерфейс доступным для всех установщиков ваших продуктов.

Вы также можете использовать служебную программу installUtil.exe для тестирования компонента установщика.

Если вы создали сборку класса C# с помощью своего класса Installer, измените настройки отладки, чтобы запустить внешнюю программу C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe. и введите соответствующие аргументы командной строки (например, / Args = myargument "путь к сборке")

В качестве последней установки контрольных точек нажмите f5, и вы приступите к отладке кода. --paralax

Я использую следующий класс для записи простого журнала в целевой каталог. На мой взгляд, это проще, чем пытаться использовать отладчик Visual Studio.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace MyCompany.Deployment
{
    /// <summary>
    /// Enables a quick and easy method of debugging custom actions.
    /// </summary>
    class LogFile
    {
        const string FileName = "MyCompany.Deployment.log";
        readonly string _filePath;

        public LogFile(string primaryOutputPath)
        {
            var dir = Path.GetDirectoryName(primaryOutputPath);
            _filePath = Path.Combine(dir, FileName);
        }

        public void Print(Exception ex)
        {
            File.AppendAllText(_filePath, "Error: " + ex.Message + Environment.NewLine +
                    "Stack Trace: " + Environment.NewLine + ex.StackTrace + Environment.NewLine);
        }

        public void Print(string format, params object[] args)
        {
            var text = String.Format(format, args) + Environment.NewLine;

            File.AppendAllText(_filePath, text);
        }

        public void PrintLine() { Print(""); }
    }
}

В целях ведения журнала (в 3.5) как насчет использования:

Context.LogMessage("My message");

Удивлен, но на самом деле никто не ответил. Поместите MessageBox.Show ("привет") в член Install () вашего настраиваемого действия. Создайте развертывание в конфигурации отладки. Установить. Когда появится MessageBox, войдите в VS IDE, выберите Debug, Attach Process и найдите экземпляр msiexec с меткой «Managed». Присоедините отладчик к этому экземпляру msiexec. Теперь вернитесь к источнику вашего настраиваемого действия и поместите точку останова сразу после вызова MessageBox.Show (). Закройте MessageBox, и ваша точка останова будет достигнута, и вы отлаживаете в среде IDE!

+1: хотя следует отметить, что флажок Show All Processesявляется установлен. Кроме того, можно было GetCurrentProcess и положительно идентифицировать правильный процесс с Id. :)

IAbstract 18.10.2012 23:54

Зачем использовать это, если можно вызвать в System.Diagnostics.Debugger.Break()? Вам необходимо добавить dll WindowsForms, чтобы использовать MessageBox. Кроме того, для CustomInstallers имя процесса будет InstallUtil.

daniloquio 11.11.2015 01:51

В методе установщика добавьте оператор Debugger.Launch (), который запустит «Отладчик своевременного Visual Studio», где вы можете присоединить экземпляр Visual Studio и отладить свой класс установщика (MSI). Это должно работать и в Visual Studio 2010. Но для этого у вас должны быть права администратора. Если у вас нет прав администратора, у вас могут возникнуть проблемы. Итак, войдите как администратор для отладки MSI. Например:

public override void Install(System.Collections.IDictionary stateSaver)
{
    Debugger.Launch();
    base.Install(stateSaver);

}

В Visual Studio 2005 для работы используется даже Debugger.Break (), но почему-то это не работает с Visual Studio 2010.

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

transistor1 24.05.2013 17:17

Напишите следующий код в начале метода, который вы хотите отлаживать.

#if DEBUG
MessageBox.Show(Process.GetCurrentProcess().Id.ToString());
#endif

Поэтому, когда ваш метод вызывается, будет выполнен приведенный выше код, и вы сможете присоединить отладчик к процессу (ctrl + alt + p), используя указанный выше идентификатор процесса. Возможно, вам придется запустить VS с повышенными разрешениями.

Вы можете автоматизировать отладку проектов установщика, добавив следующий раздел в файл .csproj или .csproj.user:

<PropertyGroup Condition = "'$(Configuration)' == 'Debug'">
  <StartAction>Program</StartAction>
  <StartProgram>$(MSBuildBinPath)\installutil.exe</StartProgram>
  <StartArguments>$(AssemblyName).dll</StartArguments>
</PropertyGroup>

Используйте файл проекта, если хотите, чтобы другие разработчики извлекли выгоду из этого изменения, и файл .user, если хотите использовать его самостоятельно.

Ничего из вышеперечисленного у меня не сработало. Вот что действительно сработало. Обратите внимание, что вам нужно вставить «обе» строки.

using System.Diagnostics;

MessageBox.Show("Test is about to begin");
Debugger.Launch();

Это то, что на самом деле сработало для меня.

System.Diagnostics.Debugger.Launch();

Затем щелкните правой кнопкой мыши проект установщика и нажмите «Установить».

Другие вопросы по теме