2015-03-08 3 views
1

У меня есть .net dll, его можно зарегистрировать с помощью RegAsm.net 3.5 и .net 4.5Inno ошибка установки handeling (игнорировать) в RUN Раздел команды

Я использую это коды в моей настройки скрипта:

[Run] 
Filename: "{dotnet40}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls." 
Filename: "{dotnet4064}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls." 
Filename: "{dotnet20}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls." 
Filename: "{dotnet2064}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls." 
  • Он хорошо работает, если .net 3.5 и .net 4.5 установлены на целевой машине.
  • У меня есть функция в моем скрипте для проверки .net в InitializeSetup. так что я знаю, один из этих версий устанавливаются на систему: v3.5 v4 v4.5

Но

мы получаем ошибку в некоторых случаях, как это: , если мы не .NET 3.5 целевая машина

Я предполагаю, что причина ошибки:

{dotnet20}

.NET Framework version 2.0 root directory. {dotnet20} is equivalent to {dotnet2032} unless the install is running in 64-bit mode, in which case it is equivalent to {dotnet2064}.

An exception will be raised if an attempt is made to expand this constant on a system with no .NET Framework version 2.0 present.

Мой вопрос, как я могу справиться и игнорировать это исключение и предотвратить установку откат:

Internal error: .Net Framework version 2.0 not found.

+1

Вы должны использовать 'Check' и в своих функциях вы должны проверить, что вы можете найти целевой бинарный файл, а также поймать, когда некоторая константа не может быть расширена, ['что-то вроде этого'] (http: // pastebin.com/Uw4kEJs1) и идеально подходит для всех записей. Поскольку это довольно много работы, я бы рассмотрел возможность записи этой регистрации исключительно в каком-то событии '[Code]. Конечно, исключение будет поднято даже там, но это немного меньше работы. Я не знаю другого способа преодолеть это в разделе '[Run]' без 'Check', который предотвратит предстоящий сбой (подходящий для этой ситуации). – TLama

+0

Другим вариантом может быть извлечение того, как Inno Setup расширяет эти константы и использует их в коде. Это может быть исключение. – TLama

+0

@TLama спасибо, я попробовал «проверить» перед вашим комментарием и снова увидеть ошибку. поэтому я создаю новую версию своего приложения под '.Net 4.5' и удаляю некоторые коды и ... знаю, что моя настройка работает хорошо. – RAM

ответ

1

Если вы хотите придерживаться секции [Run] и не писать это в коде сценариев, то я думаю, что у вас нет много вариантов на выбор. Исключение возникает, когда константа не может быть расширена, и это именно так. Единственный вариант, о котором я могу думать, это добавить функцию Check, которая попытается развернуть константу в блоке try..except и предотвратить запись, которая будет обрабатываться при возникновении исключения. Нечто подобное следующим образом (на основе кода, укороченный):

[Run] 
Filename: "{dotnet20}\RegAsm.exe"; Parameters: "File.dll"; Check: RegAsmDotNet20Exists 

[Code] 
function RegAsmDotNet20Exists: Boolean; 
begin 
    try 
    // process the entry only if the target binary could be found (and so the 
    // folder constant could have been properly expanded) 
    Result := FileExists(ExpandConstant('{dotnet20}\RegAsm.exe')); 
    except 
    // this is the fallback in case the folder constant could not be expanded, 
    // or something unexpected happened when checking if the binary file to be 
    // executed exists; in such case, don't process the entry 
    Result := False; 
    end; 
end; 

Еще один, довольно чистый и немного более безопасным вариантом будет делать регистрацию сборки чисто из [Code] раздела в некоторых послеустановочные событий. Несмотря на то, что вам все равно придется ловить исключения при использовании этих констант, вы получите больше контроля над этим инструментом (например, вы можете получить код выхода, чтобы получить причину ошибки, если этот инструмент использует его).

+0

Sidenote; остерегайтесь того, что по умолчанию ['отладчик показывает в IDE диалог исключения] (http://stackoverflow.com/q/22039048/960757), независимо от того, обрабатывается исключение. – TLama

Смежные вопросы