Отладка C # пользовательских классов установщика - PullRequest
27 голосов
/ 11 ноября 2008

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

Ответы [ 14 ]

43 голосов
/ 11 ноября 2008

Что-то удобное для трудной отладки разделов кода -

System.Diagnostics.Debugger.Break()

Сгенерирует точку останова, пойманную любым установленным отладчиком (VStudio, WinDbg, Удаленный отладчик и т. Д.).

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

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

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

10 голосов
/ 24 апреля 2010

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

[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-интерфейсы, специфичные для вашего установщика (s), как мы привыкли к разработке пользовательского интерфейса. (В любом случае, установщик - это просто еще один пользовательский интерфейс.) Это особенно важно, если ваша цель состоит в том, чтобы использовать определенный интерфейс пользовательского интерфейса для всех установщиков ваших продуктов.

4 голосов
/ 11 ноября 2008

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

3 голосов
/ 27 февраля 2013

В вашем методе установки добавьте оператор 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 голос
/ 27 июля 2015

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

using System.Diagnostics;

MessageBox.Show("Test is about to begin");
Debugger.Launch();
1 голос
/ 24 марта 2013

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

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

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

1 голос
/ 07 марта 2011

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

Context.LogMessage("My message");
1 голос
/ 19 июля 2010

Я использую следующий класс для записи простого журнала в целевой каталог. На мой взгляд, это проще, чем пытаться использовать отладчик 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(""); }
    }
}
1 голос
/ 29 июня 2010

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

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

По мере того, как вы в последний раз устанавливали свои точки останова, нажмите клавишу f5, и вы настроены на отладку кода. --paralax

...