Я написал простой интерфейс в библиотеку SMO SQL, поэтому я могу остановить и запустить SQL Server во время установки из скриптов Inno Setup. Моя машина разработки - это 64-разрядная процессорная машина. Управляемый код написан на Visual Basic с использованием DllExport для .Net, ориентированного на .NET 4.0 и компиляции для платформы x86. Я использую версию Inno Setup 5.5.9 Unicode.Inno Setup .NET DLL-вызов работает в 64-битном режиме, не работает в 32-разрядном
Выполнение установки отлично работает на моей машине разработки и других 64-разрядных процессорах, которые я пробовал. При запуске исполняемого файла на процессорной системе с 32-битным я получаю сообщение об ошибке:
External Exception E0434352
который довольно бесполезен и родовые. Обе системы - это Windows 10, но я пробовал ее и в других версиях Windows, а 64-разрядные - 32-битные. Итак, что я сделал, чтобы препятствовать работе на 32 бит?
Inno Setup Код:
[Files]
Source: "fiSqlSmoLib2\bin\x86\Debug\fiSqlSmoLib2.dll"; DestDir: "{app}"; \
Flags: nocompression 32bit
[Code]
function StartSql(machineName, sqlServerName: AnsiString): Integer;
external '[email protected]:fiSqlSmoLib2.dll stdcall setuponly delayload';
function StopSql(machineName, sqlServerName: AnsiString): Integer;
external '[email protected]:fiSqlSmoLib2.dll stdcall setuponly delayload';
function InitializeSetup(): Boolean;
var
SQLresultCode : Integer;
Computer : String;
SQLServer : String;
begin
Computer := GetComputerNameString;
SQLServer := 'FACTORYINSITE';
try
SQLresultCode := StopSql(Computer, SQLServer);
except
ShowExceptionMessage;
exit;
end;
try
SQLresultCode := StartSql(Computer, SQLServer);
except
ShowExceptionMessage;
exit;
end;
end;
Visual Basic код:
Imports System.Runtime.InteropServices
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Common
Imports Microsoft.SqlServer.Management.Smo.Wmi
Imports RGiesecke.DllExport
Public Class fiSqlSmo
<DllExport("StartSql", CallingConvention.StdCall)> _
Public Shared Function StartSql(<MarshalAs(UnmanagedType.LPStr)> machineName As String, <MarshalAs(UnmanagedType.LPStr)> sqlServerName As String) As Integer
Dim mc As ManagedComputer
Dim Svc As Service
Dim svcState As ServiceState
Try
mc = New ManagedComputer(machineName)
Svc = mc.Services("MSSQL$" + sqlServerName)
Catch ex As Exception
Return ServiceState.Unknown
End Try
Try
svcState = Svc.ServiceState
Catch ex As Exception
Return ServiceState.Unknown
End Try
If (Svc.ServiceState <> ServiceState.Running) Then
Svc.Start()
End If
Return svcState
End Function
<DllExport("StopSql", CallingConvention.StdCall)> _
Public Shared Function StopSql(<MarshalAs(UnmanagedType.LPStr)> machineName As String, <MarshalAs(UnmanagedType.LPStr)> sqlServerName As String) As Integer
Dim mc As ManagedComputer
Dim Svc As Service
Dim svcState As ServiceState
Try
mc = New ManagedComputer(machineName)
Svc = mc.Services("MSSQL$" + sqlServerName)
Catch ex As Exception
Return ServiceState.Unknown
End Try
Try
svcState = Svc.ServiceState
Catch ex As Exception
Return ServiceState.Unknown
End Try
If (Svc.ServiceState = ServiceState.Running) Then
Svc.Stop()
End If
Return svcState
End Function
End Class
Я уверен, что SMO не установлен по умолчанию, он доступен на машинах, где он не работает? работает ли ваш код из консольного приложения на этих машинах? Вам не нужно SMO для запуска/остановки службы MSSQL, вы можете просто использовать 'ServiceController' или удалить любые .Net-зависимости с помощью [Pascal Script] (http://stackoverflow.com/questions/2456987/upgrading-windows-service- using-inno-setup) –
Или попытайтесь поймать и зарегистрировать любое исключение в коде VB.NET для отладки проблемы. –
Я считаю, что SMO установлен на тестовых машинах, но это хорошее предложение для проверки. Я также попробую консольное приложение. SQL-сервер будет на другом узле, чем код установки, или, возможно, на Azure, поэтому я думаю, что SMO может быть лучшим методом. В полной установке я также запишусь на SQL-сервер и запускаю скрипты, поэтому я должен убедиться, что он работает. – jphoekstra