Я написал класс установки, который расширяет Installer и переопределяет afterInstall, но я получаю исключение нулевого указателя. Как я могу отладить мой класс?
Отладка классов пользовательского установщика С#
Ответ 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();
Затем щелкните правой кнопкой мыши на проекте установщика и нажмите "Установить"