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





создайте виртуальную машину, установите Visual Studio, сделайте ее копию (или создайте другой виртуальный жесткий диск) и запустите установщик в отладчике под виртуальной машиной.
Я бы так и поступил (но я не эксперт).
прикрепите процесс установки к Visual Studio в Debug-> Processes-> Attach или CTRL + ALT + P установите точку останова, и вы сможете перейти
И каков процесс установки (название?)
Что-то, что удобно для трудноотлаживаемых участков кода, - это
System.Diagnostics.Debugger.Break()
Выдает точку останова, обнаруженную любым установленным отладчиком (VStudio, WinDbg, удаленный отладчик и т. д.).
Используйте его для отладки действительно сложных областей, где обычное нажатие F5 + Go или «Присоединить к процессу» сложно или невозможно выполнить, некоторые примеры включают:
Не сработало для меня, не выполнив сначала System.Diagnostics.Debugger.Launch ()
Привет, Марк - Break пытается запустить любой отладчик, указанный в ключах реестра автоматической отладки. Я могу представить, что если не указан отладчик, он ничего не сделает - затем попытайтесь его прикрепить - ничего не получится. Где, как, запустив его явно, вы присоединяете этот экземпляр. msdn.microsoft.com/en-us/library/windows/desktop/… имеет более подробную информацию. Был скрытый диалог для указания отладчика по умолчанию - на данный момент я ускользает.
Кроме того, не забудьте собрать установщик в режиме отладки, чтобы файлы отладки были там. И еще мне пришлось отключить "Включить только мой код". Работал как шарм! Спасибо!
Я использую EventLog.WriteEntry («источник», «сообщение») и проверяю журнал событий при установке. Может не оптимально, но у меня работает :)
Я бы сделал то же самое ... напишите в журнал и проверьте журнал, как только приложение завершит выполнение, так что получите четкую картину того, что происходит ... Утверждая тот факт, что вы достаточно педантичны!
Лучший способ, который я нашел, - это написать модульный тест, а также создать новый и инициализировать свой класс установщика из вашего модульного теста:
[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. :)
Зачем использовать это, если можно вызвать в System.Diagnostics.Debugger.Break()? Вам необходимо добавить dll WindowsForms, чтобы использовать MessageBox. Кроме того, для CustomInstallers имя процесса будет InstallUtil.
В методе установщика добавьте оператор 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 Но для этого у вас должны быть права администратора.. Это единственный ответ, в котором так сказано, и я думаю, что это моя проблема.
Напишите следующий код в начале метода, который вы хотите отлаживать.
#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();
Затем щелкните правой кнопкой мыши проект установщика и нажмите «Установить».
Объедините это с советом System.Diagnostics.Debugger.Break (), и жизнь станет действительно хорошей в создании отлаживаемых репродукций.