Чтобы уменьшить сам размер библиотеки CEF, потребуется полная перестройка и некоторая фаза отладки.Потрачено много времени, возможно, не стоит - 40 МБ невелики, в зависимости от мощности компьютера и пропускной способности сети.Я предпочел бы полагаться на «официальный» выпуск CEF, чтобы следить за последними версиями браузера.
Если ваша проблема связана с размером пакета развертывания и одним исполняемым файлом / без возможности установки, вы можете рассмотреть возможность встраиванияdll
s внутри exe
.
Хитрость, которую я использовал, заключается в том, что .dll
файлы сохраняются в виде zip внутри основного .exe
, а затем распаковываются в личную временную папку на жестком диске.диск (возможно, вы захотите использовать ту же папку, но она не будет работать в C:\Program Files
из-за UAC Vista / Seven, и ваш пользователь может задаться вопросом, откуда все эти файлы поступают из-за этого - вот почему я использую частныйпапка).
С точки зрения пользователя, нужно запустить только один исполняемый файл.Все .dll
файлы сжаты внутри, и вы также можете добавить некоторые недвоичные ресурсы к файлам (что невозможно с компакторами exe / dll).Скрытая папка создается и используется для загрузки библиотек (которые должны быть загружены с LoadLibrary()
, без статической привязки), и декомпрессия будет выполняться только один раз (поэтому это будет быстрее, чем при использовании компрессора exe / dll).
Я использовал его, например, для встраивания библиотеки hunspell.dll и словаря английского языка в наш инструмент SynProject .Код выглядит следующим образом:
constructor THunSpell.Create(DictionaryName: string='');
var Temp, HunSpell, Aff, Dic: TFileName;
i: integer;
begin
if DictionaryName='' then
DictionaryName := 'en_US';
Temp := GetSynopseCommonAppDataPath;
HunSpell := Temp+'hunspell.dll';
with TZipRead.Create(HInstance,'Zip','ZIP') do
try
Aff := DictionaryName+'.aff';
if not FileExists(Temp+Aff) then
StringToFile(Temp+Aff,UnZip(NameToIndex(Aff)));
Dic := DictionaryName+'.dic';
if not FileExists(Temp+Dic) then
StringToFile(Temp+Dic,UnZip(NameToIndex(Dic)));
if not FileExists(HunSpell) then
StringToFile(HunSpell,UnZip(NameToIndex('hunspell.dll')));
finally
Free;
end;
fHunLib := SafeLoadLibrary(HunSpell);
if fHunLib=0 then
exit;
if not LoadEntryPoints then begin
FreeLibrary(fHunLib);
fHunLib := 0;
exit;
end;
fDictionaryName := DictionaryName;
fHunHandle := Hunspell_create(pointer(Temp+Aff),pointer(Temp+Dic));
if fHunHandle=nil then
exit;
(....)
end;
См. эту ссылку о деталях и исходном коде.
Вы можете рассмотреть возможность использования низкоуровневого хака, такого как BTMemoryModule, но у вас не будет никакого возможного сжатия.