2016-12-06 13 views
2

Я написал простой интерфейс в библиотеку 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 
+1

Я уверен, что SMO не установлен по умолчанию, он доступен на машинах, где он не работает? работает ли ваш код из консольного приложения на этих машинах? Вам не нужно SMO для запуска/остановки службы MSSQL, вы можете просто использовать 'ServiceController' или удалить любые .Net-зависимости с помощью [Pascal Script] (http://stackoverflow.com/questions/2456987/upgrading-windows-service- using-inno-setup) –

+0

Или попытайтесь поймать и зарегистрировать любое исключение в коде VB.NET для отладки проблемы. –

+0

Я считаю, что SMO установлен на тестовых машинах, но это хорошее предложение для проверки. Я также попробую консольное приложение. SQL-сервер будет на другом узле, чем код установки, или, возможно, на Azure, поэтому я думаю, что SMO может быть лучшим методом. В полной установке я также запишусь на SQL-сервер и запускаю скрипты, поэтому я должен убедиться, что он работает. – jphoekstra

ответ

1

Проблема, как представляется, версия SMO сборок, используемых. Программа установки, которая работает, была связана с версией SMO SLQ 2016, в то время как машины, на которых она потерпела неудачу, имели только SQL 2008 R2. Кажется совпадением, что машины со старой версией 32 бит.

Восстановление кода .NET для ссылки на самую старую версию SMO заставляет ее работать на всех машинах.