У меня есть скрипт 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: шрифт '?'не может быть найден.
Это мой сценарий установки 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 действительно вызывает эту проблемную функцию.