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

Отладка классов пользовательского установщика С#

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

4b9b3361

Ответ 1

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

System.Diagnostics.Debugger.Break()

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

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

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

Ответ 2

Лучший способ, который я нашел, - написать unit test, а новый и инициализировать ваш класс установщика из unit test:

[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. Это особенно полезно для очень крупных установщиков с LOTS компонентов. Затем вы также можете создавать упорядоченные модульные тесты и запускать их последовательно, чтобы имитировать ваш установщик во время отладки или ваших автоматических сборок.

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

Ответ 3

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

Ответ 4

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

Ответ 5

В вашем методе установки добавьте оператор 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.

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Context.LogMessage("My message");

Ответ 10

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

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

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

Ответ 11

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

using System.Diagnostics;

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

Ответ 12

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

Вот что я сделал бы (но я не эксперт).

Ответ 13

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

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

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

Ответ 14

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

System.Diagnostics.Debugger.Launch();

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