#inno-setup
#inno-setup
Вопрос:
Я написал библиотеку классов с использованием Visual Studio 2010 C # для чтения информации об оборудовании компьютера (например, HDD / SSD). Я буду использовать эту dll для создания установщика с помощью InnoSetup для чтения информации об оборудовании целевого компьютера. Теперь мои проблемы в том, что .NET dll нельзя использовать напрямую, если она уже не зарегистрирована. Я пытаюсь найти способ зарегистрировать dll во время InitializeSetup в InnoSetup, чтобы я мог использовать функции в dll. Вот сценарий, который я написал для установщика.
function InitializeSetup(): Boolean;
var
obj: Variant;
diskPartitions: Integer;
va: String;
ErrorCode: Integer;
b: Boolean;
begin
ExtractTemporaryFile('SSHardwareChecker.dll');
RegisterServer(False, ExpandConstant('{tmp}SSHardwareChecker.dll'), False);
obj := CreateOleObject('SSHardwareChecker.SSClass');
va := obj.GetDiskDriveInformation;
MsgBox(va, mbInformation, mb_Ok);
b:=UnregisterServer(False, ExpandConstant('{tmp}SSHardwareChecker.dll'), False);
end;
Функция RegisterServer
, похоже, не работает.Выдает ошибку, которая гласит RegSvr32 failed with exit code 0x4
. Я прочитал много статей в сети, в которых говорится, что .net dll должна быть зарегистрирована с помощью regasm. Я действительно не знаю, как это сделать, особенно в Inno Setup.
Пожалуйста, помогите, ребята.
Ответ №1:
Хотя прошло больше года, недавно у меня возникла та же проблема, и я смог исправить ее с помощью приведенного ниже скрипта.
[Run]
Filename: "{dotnet20}RegAsm.exe"; Parameters: /codebase YourDLL.dll; WorkingDir: {app}; StatusMsg: "Registering Controls..."; Flags: runminimized
Если файл был зарегистрирован на этапе инициализации, мы можем использовать одну из функций поддержки Inno setup.
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
Более подробную информацию можно найти в: Справка по установке Inno
Комментарии:
1. Обратите внимание, что это происходит во ВРЕМЯ установки и, как таковой, слишком поздно для использования DLL во время
InitialiseSetup
. В противном случае, это допустимое решение для последующего использования DLL.2. @Nyerguds Я предполагаю, что, хотя, если вы работаете в 3.5, у вас также должен быть установлен 2.0 со всеми основными исполняемыми файлами внутри него. Я надеюсь, что это также часть операционной системы.
3. @Venkatesh Kumar Я просмотрел это, и кажется, что 3.5 считается «обновлением» 2.0 и, как таковое, по-прежнему использует папку приложений 2.0. Итак,
{dotnet20}
отлично работает для версии 3.5. В любом случае, большое спасибо, этот код действительно мне помог 🙂4. Обратите внимание, что для языковой совместимости вы можете использовать исходное сообщение о состоянии для регистрации DLL-файлов, используя что-то вроде
{code:StrStatusRegisterFiles}
asStatusMsg
, а затем заставить эту функцию извлекать исходную строку установщика, зависящую от языка, из [Сообщений] с помощьюresult := SetupMessage(MsgStatusRegisterFiles);
Ответ №2:
Для этого НЕОБХОДИМО..
1) убедитесь, что установлен .net 4.0 (пока не по умолчанию на большинстве компьютеров)
2) извлеките и зарегистрируйте DLL (вам нужно вызвать regasm.exe в извлеченной DLL)
Это многое нужно сделать, чтобы просто «GetDiskDriveInformation» в качестве самого первого шага установки.
Гораздо лучше получить информацию изначально в Inno или вызвать собственную DLL, для которой нет необходимых условий.