Открытие окна WinForms в Inno Setup не работает на старых версиях Windows - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть скрипт Inno Setup, в котором требуемая форма была слишком сложной, чтобы ее можно было полностью построить в самой Inno Setup, поэтому я создал вспомогательную библиотеку классов в .NET, которая содержит окно WinForms с необходимыми мне вещами.

Я открываю это окно WinForms в Inno Setup, предоставляя метод с помощью Unmanaged Exports NuGet от Robert Giesecke.

Это прекрасно работает на моей машине под управлением Windows 10.Он также работает на тестовом сервере под управлением Windows Server 2012 и 2016. Однако, когда я пытаюсь запустить установку на компьютере с Windows Server 2008R2, у меня появляется следующая ошибка: Sytem.ArgumentException: Font '?' cannot be found.

Sytem.ArgumentException: шрифт '?'не может быть найден.

Это мой сценарий установки Inno:

#define MyAppName "InnoTest"
#define MyAppVersion "1.0"
#define MyAppPublisher "Test"
#define MyAppURL "http://inno.test"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputDir=C:\Users\Admin\Desktop\test_inno
OutputBaseFilename=test_inno_setup_x64
Compression=lzma/Max
SolidCompression=true

[Files]
Source: "C:\Users\Admin\Documents\Visual Studio 2017\Projects\InnoTestNet\InnoTestNet\bin\Release\InnoTestNet.dll"; DestDir: "{tmp}"; Flags: dontcopy

[Code]
procedure ShowTestForm(); external 'ShowTestForm@files:InnoTestNet.dll stdcall';

procedure InitializeWizard();
begin
  ShowTestForm();     
end;

и мой код C #:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using RGiesecke.DllExport;

namespace InnoTestNet
{
    public class InnoTestNet
    {
        [DllExport("ShowTestForm", CallingConvention = CallingConvention.StdCall)]
        public static void ShowTestForm()
        {
            try
            {
                var testForm = new TestForm();
                testForm.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

Я уменьшил окно WinForms до чистогоминимум (всего одна метка).

Вещи, которые я пробовал:

  • Встраивание «Arial.otf» в библиотеку классов, загрузка шрифта во время выполнения с PrivateFontCollection и установка шрифта наWinForm.
  • Использование другого шрифта, такого как Calibri или Tahoma
  • Изменение шрифта самого установщика InnoSetup (DefaultDialogFontName)
  • Выполнение «Application.EnableVisualStyles ()» *

Среда Windows Server 2008R2 является полностью обновленной чистой установкой с инсталляцией .NET Framework 4.7.2.

Библиотека классов предназначена для .NET Framework 4.5.2.

Я использую версию InnoSetup 5.6.1 для Unicode.

edit

Я нашел этот интересный вопрос SO: Использование SetDefaultDllDirectories прерывает обработку шрифтов

Похожепри вызове функции «SetDefaultDllDirectories» из Windows API разрешение шрифтов может быть нарушено.При дальнейшем отслеживании замечаний к выпуску Inno Setup 5.5.9 выясняется, что Inno Setup действительно вызывает эту проблемную функцию.

...