Я работаю над приложением, использующим MSMQ для межпроцессного взаимодействия, и мне нужен проект установки, чтобы иметь возможность установить службу, если она еще не была. Я проверил информацию о том, как сделать это предпосылкой, но пока я не смог найти это. Есть идеи?В том числе MSMQ как обязательное условие для моего приложения
ответ
Обнаружил ответ самостоятельно ... установщик компонентов Windows не искалечен типичной неспособностью установить несколько MSI в любой момент времени, поэтому я могу использовать пользовательское действие установщика для выполнения команды для установки MSMQ.
Вот мой класс Installer (ваши варианты, очевидно, могут отличаться):
public partial class MSMQInstaller : Installer
{
public MSMQInstaller()
{
InitializeComponent();
}
[DllImport("kernel32")]
static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FreeLibrary(IntPtr hModule);
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
bool loaded;
try
{
IntPtr handle = LoadLibrary("Mqrt.dll");
if (handle == IntPtr.Zero || handle.ToInt32() == 0)
{
loaded = false;
}
else
{
loaded = true;
FreeLibrary(handle);
}
}
catch
{
loaded = false;
}
if (!loaded)
{
if (Environment.OSVersion.Version.Major < 6) // Windows XP or earlier
{
string fileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "MSMQAnswer.ans");
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(fileName))
{
writer.WriteLine("[Version]");
writer.WriteLine("Signature = \"$Windows NT$\"");
writer.WriteLine();
writer.WriteLine("[Global]");
writer.WriteLine("FreshMode = Custom");
writer.WriteLine("MaintenanceMode = RemoveAll");
writer.WriteLine("UpgradeMode = UpgradeOnly");
writer.WriteLine();
writer.WriteLine("[Components]");
writer.WriteLine("msmq_Core = ON");
writer.WriteLine("msmq_LocalStorage = ON");
}
using (System.Diagnostics.Process p = new System.Diagnostics.Process())
{
System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo("sysocmgr.exe", "/i:sysoc.inf /u:\"" + fileName + "\"");
p.StartInfo = start;
p.Start();
p.WaitForExit();
}
}
else // Vista or later
{
using (System.Diagnostics.Process p = new System.Diagnostics.Process())
{
System.Diagnostics.ProcessStartInfo start = new System.Diagnostics.ProcessStartInfo("ocsetup.exe", "MSMQ-Container;MSMQ-Server /passive");
p.StartInfo = start;
p.Start();
p.WaitForExit();
}
}
}
}
}
Спасибо !! Вот версия VB.Net для всех, кто интересуется.
Option Explicit On
Option Strict On
Imports System.Diagnostics.Process
Imports System.IO
Imports System.Text
'Required in all cases when calling API functions
Imports System.Runtime.InteropServices
Imports System.Configuration.Install.Installer
<System.ComponentModel.RunInstallerAttribute(True)> _
Public Class msmqInstaller
Inherits System.Configuration.Install.Installer
Private Declare Function LoadLibrary Lib "kernel32" (ByVal lpFileName As String) As IntPtr`enter code here`
<DllImport("KERNEL32.DLL", EntryPoint:="FreeLibrary", SetLastError:=True)> _
Public Shared Function FreeLibrary(ByVal hModule As IntPtr) As Boolean
' Leave function empty - DLLImport attribute
' forces calls to LoadLibrary to
' be forwarded to LoadLibrary in KERNEL32.DLL
End Function
Public Const MAX_PATH As Integer = 256
' Dim testKernel As loadlibrary
Dim p As New Process
' Dim startInfo As New ProcessStartInfo("sysocmgr.exe", "/i:sysoc.inf /u:\"" + fileName + " \ "")
Dim fileName As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "MSMQAnswer.ans")
Dim writer As New StreamWriter(fileName)
' Override the 'Install' method of the Installer class. When overridden in a derived class, performs the installation.
'You must override the Install and Uninstall methods to add the code to perform your custom installation steps.
Public Overrides Sub Install(ByVal mySavedState As IDictionary)
MyBase.Install(mySavedState)
Dim loaded As Boolean = False
Dim fileName As String
Dim writer As StreamWriter
Dim p As Process
Try
Dim handle As IntPtr = LoadLibrary("Mqrt.dll")
If handle = IntPtr.Zero Or handle.ToInt32 = 0 Then
loaded = False
Else
loaded = True
FreeLibrary(handle)
End If
Catch ex As Exception
loaded = False
End Try
If Not loaded = True Then
If Environment.OSVersion.Version.Major < 6 Then ' windows xp or earlier
fileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "MSMQAnswer.ans")
writer = New System.IO.StreamWriter(fileName)
Using writer
writer.WriteLine("[Version]")
' writer.WriteLine("Signature = \"$Windows NT$\"")
writer.WriteLine("Signature = \""$Windows NT$\""")
writer.WriteLine()
writer.WriteLine("[Global]")
writer.WriteLine("FreshMode = Custom")
writer.WriteLine("MaintenanceMode = RemoveAll")
writer.WriteLine("UpgradeMode = UpgradeOnly")
writer.WriteLine()
writer.WriteLine("[Components]")
writer.WriteLine("msmq_Core = ON")
End Using
p = New System.Diagnostics.Process()
Using p
Dim startInfo As New ProcessStartInfo("sysocmgr.exe", "/i:sysoc.inf /u:\" + fileName + " \ ")
p.StartInfo = startInfo
p.Start()
p.WaitForExit()
End Using
Else 'windows vista or later, server 03
p = New System.Diagnostics.Process
Using p
Dim startInfo As New ProcessStartInfo("ocsetup.exe", "MSMQ-Container;MSMQ-Server /passive")
p.StartInfo = startInfo
p.Start()
p.WaitForExit()
End Using
End If
End If
End Sub
End Class
Как насчет команды pkgmgr?
PKGMGR/ЕД: MSMQ-Container, MSMQ-сервер
В моем ответе, похоже, делается то же, что и 'ocsetup.exe'. –
Но ocsetup в нет по умолчанию в Windows 8.1 – Miguel
- 1. Добавить Kinect SDK как обязательное условие для моего приложения
- 2. Scala - обязательное условие для Spark?
- 3. В том числе stdC++ из приложения iPhone
- 4. Как создать пользовательский том для моего приложения
- 5. Как отключить все эффекты значков, в том числе эффект блеска, на iphone/ipad для моего приложения?
- 6. Makefile переменная, как обязательное условие
- 7. Сложное условие IF, в том числе логическое И/ИЛИ
- 8. беда в том числе PHPUnit
- 9. API для путешествий, в том числе трафика?
- 10. PHP, в том числе работает как iFrame?
- 11. makefile match-anything как обязательное условие
- 12. в том числе грабли в драгоценных камнях
- 13. Проблема в том числе AVAudioPlayer
- 14. В том числе библиотеки JQuery
- 15. Проблема в том числе PIE.htc
- 16. В том числе частичный шаблон
- 17. Вопрос: В том числе «Paper.js»
- 18. Макро в том числе цикл как выражение?
- 19. .NET Framework 4.0.3 как обязательное условие в пакете ClickOnce
- 20. в том числе .h файл из другого приложения/каталога
- 21. PHP - Как обрабатывать в том числе контент?
- 22. .NET 3.5 SP1 обязательное условие, MS, предоставляющее клиентам 4.0
- 23. В том числе .gif в проекте андроида
- 24. CF - Установка приложения CAB (в том числе .net cf ...)
- 25. Как выполнить запрос, в том числе Где?
- 26. В том числе модуль drupal в узле
- 27. В том числе url.py приложения Django приводит к 404
- 28. Ошибка в том числе изображения в Latex
- 29. В том числе Formvalidation.io в метеор
- 30. Угловой JS - в том числе Маршруты
Это крекер. Спасибо, что поделились. –
Как вы называете метод установки? Я уже добавил ссылку 'system.configuration.Install' Метод InitializeComponent - это метод в базе? как я могу использовать этот класс для установки msmq? –
@Adam: Вы взяли отдельную библиотеку классов для этого класса установщика? При использовании кода я получаю сообщение об ошибке «Не могу найти InitializeComponent». – Abhishek