Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258

Упаковать архивированную DLL в ресурсы

16.12.2023, 20:08. Показов 1241. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго все здравия.

В общем суть такова, решил перевести одно из своих приложений на с .NET Framework 4.8 и использовать возможность загрузки упакованных в ZIP сторонних DLL сборок из ресурсов.
Cейчас помещаю сборку в чистом виде (не упакованный DLL) в ресурсы и гружу оттуда, но вот хотелось бы воспользоваться возможностью получить ZipEntry средствами фреймворка.

Для .Fx 4.5 актуален был такой подход
VB.NET
1
2
3
4
5
6
7
8
9
Private Function LoadDll_ZIP(ByVal sender As Object, ByVal arg As System.ResolveEventArgs) As Reflection.Assembly
            'Dll_Reference_Name - точно такое же название, которое используете в Import.
            'ZIPDLL - это название нашего архива с DLL-кой в ресурсах
            If arg.Name.Contains("Dll_Reference_Name") Then
                Dim file_ As New IO.Compression.ZipArchive(New IO.MemoryStream(My.Resources.ZIPDLL))
                Return Reflection.Assembly.Load(New IO.BinaryReader(file_.Entries(0).Open).ReadBytes(CInt(file_.Entries(0).Length)))
            End If
            Return Nothing
        End Function
Но в версии 4.8 обновили Zlib и теперь такой код не работает.

Пытался грузить ZIP через IO.Compression.GZipStream, но так и не понял как добраться до .Entries(0).Open, так как его там вообще нет...

Может кто делал подобное, поделитесь.

Добавлено через 55 минут
А все, отбой... Разобрался...

Проблема была в том, что у меня не была обновлена в системе сама сборка System.IO.Compression.

Студия предложила установить последнюю версию, скачал, установил - заработало!
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2023, 20:08
Ответы с готовыми решениями:

Как упаковать все файлы в ресурсы приложения
как сделать Папки картинки вообщем все что тносится к этой программе сделать одним exe файлом

Как упаковать ресурсы в exe файл?
Сделал программу с ресурсами в самой visual studio (картинки и прочее), при сборке проекта выходит exe и отдельно папка с ресурсами. При...

Упаковать Dll в Exe
Не могу понять как с помощью ILMerge вшить DLL в EXE Есть Dll (Ionic.Zip) Добавил в References её, чтобы затем использовать в using...

15
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
16.12.2023, 20:14
Цитата Сообщение от Yury Komar Посмотреть сообщение
Но в версии 4.8 обновили Zlib и теперь такой код не работает.
Вы что-то путаете. Код рабочий. Нужно только добавить ссылку на сборку System.IO.Compression.

Добавлено через 3 минуты
Цитата Сообщение от Yury Komar Посмотреть сообщение
меня не была обновлена в системе сама сборка System.IO.Compression
Вот это не понятно. Раз речь о .NET Framework, то данная сборка находится в GAC.

Цитата Сообщение от Yury Komar Посмотреть сообщение
Студия предложила установить последнюю версию, скачал, установил - заработало!
Что написано в файле проекта?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
16.12.2023, 20:14  [ТС]
OwenGlendower, Да я уже нашел проблему...
Ссылку добавлял, но вот сама эта System.IO.Compression почему-то была старая. Студия предложила ее скачать и обновить - обновил - заработало.

Сама сборка запустилась, но внутри видимо есть и другие сборки и вот с ними проблема, в рантайме пишет что не возможно загрузить другую сборку... Не пойму почему.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
16.12.2023, 20:16
Цитата Сообщение от Yury Komar Посмотреть сообщение
Да я уже нашел проблему
Это понятно, но вот решение мне непонятно. В моем понимании код должен работать из коробки.

Цитата Сообщение от Yury Komar Посмотреть сообщение
Студия предложила ее скачать и обновить - обновил - заработало.
Может вы через NuGet её ставили?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
16.12.2023, 20:17  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вот это не понятно. Раз речь о .NET Framework, то данная сборка находится в GAC.
да я сам не понял. Сборка то была... Но что-то студии не нравилось.. в итоге через диспетчер NUGET эта сборка обновилась и появился это .ZipArchive в списке

Добавлено через 1 минуту
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Может вы через NuGet её ставили?
Первоначально? нет я ничего вроде не ставил... она ж должна "из коробки" быть в комплекте NET...
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
16.12.2023, 20:21
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Цитата Сообщение от Yury Komar Посмотреть сообщение
Первоначально? нет я ничего вроде не ставил... она ж должна "из коробки" быть в комплекте NET...
Она и есть из коробки, но ссылки на неё по умолчанию нет. Нужно вручную добавить.

Попробуйте ради интереса удалить ссылку на NuGet пакет и добавить ссылку на сборку из GAC. Тогда не нужно будет таскать за собой эту DLL. Если только нет серьезных причин использовать именно NuGet версию.
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
16.12.2023, 20:41  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Тогда не нужно будет таскать за собой эту DLL.
так и сделал... в GAC версия у меня 4.2 - добавилась, работает отлично.
В Nuget поставила версию 4.3

ну вобщем от Nuget отказался, но так и не понял почему так получилось...

Добавлено через 14 минут
Вобщем, все получилось.

Вот такой код я использую, с возможностью поместить несколько DLL в один ZIP и грузить их оттуда
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 '(Для упакованной в ZIP (.NET Framework 4.5+))
 'ссылку на IO.Compression нужно добавлять вручную в проект из GAC
 '------------------------------------------------------------------------------------------------
 Private Function LoadDll_ZIP(ByVal sender As Object, ByVal arg As System.ResolveEventArgs) As Reflection.Assembly
     'Dll_Reference_Name - точно такое же название, которое используете в Import.
     'ZIPDLL - это название нашего архива с DLL-ками в ресурсах
 
     Dim file_ As IO.Compression.ZipArchive
 
     'Здесь, если вы в один архив поместили несколько DLL
     'то код найдет нужную внутри архива и загрузит
     'Dll_Reference_Name1 и Dll_Reference_Name2 - это разные файлы DLL внутри архива
     Select Case True
         Case arg.Name.Contains("Dll_Reference_Name1")
             file_ = New IO.Compression.ZipArchive(New IO.MemoryStream(My.Resources.ZIPDLL))
             For Each entry In file_.Entries
                 If entry.Name.StartsWith("Dll_Reference_Name1") Then
                     Return Reflection.Assembly.Load(New IO.BinaryReader(entry.Open).ReadBytes(CInt(entry.Length)))
                 End If
             Next
 
         Case arg.Name.Contains("Dll_Reference_Name2")
             file_ = New IO.Compression.ZipArchive(New IO.MemoryStream(My.Resources.ZIPDLL))
             For Each entry In file_.Entries
                 If entry.Name.StartsWith("Dll_Reference_Name2") Then
                     Return Reflection.Assembly.Load(New IO.BinaryReader(entry.Open).ReadBytes(CInt(entry.Length)))
                 End If
             Next
     End Select
 
     Return Nothing
 End Function
кстати, Готовые решения тоже обновил, добавил этот код
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
17.12.2023, 13:15
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Цитата Сообщение от Yury Komar Посмотреть сообщение
Вот такой код я использую, с возможностью поместить несколько DLL в один ZIP и грузить их оттуда
Спасибо что поделились решением, но в коде есть два момента которые не помешает исправить. Это использование Contains/StartsWith и дублирование кода. Последний момент думаю очевиден поэтому сконцентрируюсь на первом.

Вот такая проверка arg.Name.Contains("Dll_Reference_Name1") означает что в случае когда несколько сборок начинаются одинаково (например, BouncyCastle и BouncyCastle.OpenPgp), нам нужно будет не забывать писать проверки в правильном порядке. Сначала BouncyCastle.OpenPgp, а потом BouncyCastle. Иначе мы всегда будем грузить одну и ту же сборку что очевидно неправильно. Аналогичное усложнение возникает из-за конструкции entry.Name.StartsWith. По моему в обоих случаях лучше проверять на равенство.

Я бы переписал код так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Imports System.IO
Imports System.IO.Compression
Imports System.Refelection
 
Private Function LoadDll_ZIP(ByVal sender As Object, ByVal arg As ResolveEventArgs) As Assembly
 
    Dim asmName As New AssemblyName(arg.Name)
 
    Select Case asmName.Name
        Case "Dll_Reference_Name1"
            Return ExtractAssembly("Dll_Reference_Name1")
        Case "Dll_Reference_Name2"
            Return ExtractAssembly("Dll_Reference_Name2")
    End Select
 
    Return Nothing
 
End Function
 
Private Function ExtractAssembly(assemblyName As String) As Assembly
 
    Dim zipArc As New ZipArchive(New MemoryStream(My.Resources.ZIPDLL))
    Dim zipEntry As ZipArchiveEntry = zipArc.GetEntry(assemblyName & ".dll")
    
    If zipEntry Is Nothing Then Return Nothing
    Return Assembly.Load(New BinaryReader(zipEntry.Open).ReadBytes(CInt(zipEntry.Length)))
 
End Function
P.S. Я не понимаю почему программисты на VB.NET любят использовать имена классов с частичным пространством имен. Мне такой подход не нравится. Заменил на имена классов плюс соответствующий Imports.
2
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
17.12.2023, 16:46  [ТС]
OwenGlendower, Спасибо за ремарки, все по делу и очень логично.
Учту на будущее.

Добавлено через 32 минуты
OwenGlendower, Немножко доработал функцию, включив возможность загрузки не только ZIP'ованных сборок, добавив маркер "isZIP" в параметры, ну и передачу в функцию не жестко указанных String с именем сборки, а asmName.Name, так как, возможно не все сборки будут упакованы в ZIP... Ну это так, на всякий случай )))
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#Region "Загрузим DLL из ресурсов"
        Private Function LoadDll(ByVal sender As Object, ByVal arg As System.ResolveEventArgs) As Reflection.Assembly
            Dim asmName As New AssemblyName(arg.Name)
 
            Select Case asmName.Name
                Case "Dll_Reference_Name1", "Dll_Reference_Name2"
                    Return GetAssembly_FromResources(asmName.Name, True, My.Resources.DLL_ZIPPED)
            End Select
 
            Return Nothing
 
        End Function
 
        Private Function GetAssembly_FromResources(assemblyName As String, isZIP As Boolean, fileInResources As Byte()) As Assembly
            If isZIP Then
                '(Для упакованной в ZIP (.NET Framework 4.5+))
                'ссылку на IO.Compression нужно добавлять вручную в пароект из GAC
                Dim zipArc As New ZipArchive(New MemoryStream(fileInResources))
                Dim zipEntry As ZipArchiveEntry = zipArc.GetEntry(assemblyName & ".dll")
                If zipEntry Is Nothing Then Return Nothing
                Return Assembly.Load(New BinaryReader(zipEntry.Open).ReadBytes(CInt(zipEntry.Length)))
            Else
                'Не упакованной в ZIP
                Try
                    Dim AssemblyFile As New MemoryStream(fileInResources)
                    Return Assembly.Load(New BinaryReader(AssemblyFile).ReadBytes(CInt(AssemblyFile.Length)))
                Catch ex As Exception
                    Return Nothing
                End Try
            End If
        End Function
#End Region
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
17.12.2023, 17:43
Цитата Сообщение от Yury Komar Посмотреть сообщение
Немножко доработал функцию
Хороший вариант, но все еще есть что покритиковать

1) Почему в Else перехватывается исключение, а в If нет? Если уж перехватывать, то везде. По хорошему, однако, try/catch здесь не нужен. Так мы только маскируем возможную проблему. Правильнее позволить исключению всплыть.

2) MemoryStream, BinaryReader в блоке Else не нужны. Можно написать просто
VB.NET
1
Return Assembly.Load(fileInResources)
3) В комментарии есть ошибка. Вместо ссылку на IO.Compression нужно добавлять вручную в пароект из GAC нужно написать ссылку на System.IO.Compression нужно добавлять вручную в проект из GAC. Ведь ни сборки ни пространства имен IO.Compression не существует.
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
17.12.2023, 22:23  [ТС]
OwenGlendower, Ну блиииин..... И тут Вы правы... Тороплюсь, мелочи совсем не замечаю
Спасибо.

Добавлено через 4 часа 8 минут
Тогда вот, финальный вариант:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#Region "Загрузим DLL из ресурсов"
        Private Function LoadDll(ByVal sender As Object, ByVal arg As System.ResolveEventArgs) As Reflection.Assembly
            Dim asmName As New AssemblyName(arg.Name)
 
            Select Case asmName.Name
 
                Case "Dll_Reference_Name1", "Dll_Reference_Name2"
                    Return GetAssembly_FromResources(asmName.Name, True, My.Resources.DLL_ZIPPED)
 
                Case "Dll_Reference_Name3", "Dll_Reference_Name4"
                    Return GetAssembly_FromResources(asmName.Name, False, My.Resources.DLL_NOT_ZIPPED)
 
            End Select
 
            Return Nothing
 
        End Function
 
        Private Function GetAssembly_FromResources(assemblyName As String, isZIP As Boolean, fileInResources As Byte()) As Assembly
            If isZIP Then
                'Для упакованной в ZIP (.NET Framework 4.5+), 
                'ссылку на System.IO.Compression добавлять вручную в проект из GAC
                Dim zipArc As New ZipArchive(New MemoryStream(fileInResources))
                Dim zipEntry As ZipArchiveEntry = zipArc.GetEntry(assemblyName & ".dll")
                If zipEntry Is Nothing Then Return Nothing
                Return Assembly.Load(New BinaryReader(zipEntry.Open).ReadBytes(CInt(zipEntry.Length)))
            Else
                'Не упакованной в ZIP
                    Return Assembly.Load(fileInResources)
            End If
        End Function
#End Region
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
18.12.2023, 01:52
Цитата Сообщение от Yury Komar Посмотреть сообщение
Тогда вот, финальный вариант:
Хотел пошутить насчет отступов, но воздержусь Вместо этого предложу такой вариант
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#Region "Загрузим DLL из ресурсов"
        Private Function LoadDll(ByVal sender As Object, ByVal arg As ResolveEventArgs) As Assembly
            Dim asmName As New AssemblyName(arg.Name)
 
            Select Case asmName.Name
 
                Case "Dll_Reference_Name1", "Dll_Reference_Name2"
                    Return GetAssembly_FromResources(asmName.Name, True, My.Resources.DLL_ZIPPED)
 
                Case "Dll_Reference_Name3"
                    Return Assembly.Load(My.Resources.DLL3_NOT_ZIPPED)
 
                Case "Dll_Reference_Name4"
                    Return Assembly.Load(My.Resources.DLL4_NOT_ZIPPED)
 
            End Select
 
            Return Nothing
 
        End Function
 
        Private Function GetAssembly_FromResources(assemblyName As String, fileInResources As Byte()) As Assembly
            
            'Для упакованной в ZIP (.NET Framework 4.5+),
            'ссылку на System.IO.Compression добавлять вручную в проект из GAC
            Dim zipArc As New ZipArchive(New MemoryStream(fileInResources))
            Dim zipEntry As ZipArchiveEntry = zipArc.GetEntry(assemblyName & ".dll")
            If zipEntry Is Nothing Then Return Nothing
 
            Using reader As New BinaryReader(zipEntry.Open())
                Return Assembly.Load(reader.ReadBytes(CInt(zipEntry.Length)))
            End Using
        
        End Function
#End Region
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
18.12.2023, 06:14  [ТС]
OwenGlendower, Глядишь скоро до идеального варианта дойдем...

Я тут еще подумываю, так же, добавить проверку на наличие сборок и в папке DLL, рядом с EXE....

Загрузку из папки можно выполнить так (добавить условие в Select Case):
VB.NET
1
2
Case Else
    Return Assembly.LoadFrom($"{ПУТЬ К ПАПКЕ ПО}\DLL\{assemblyName}.dll")
Или может, на ваш взгляд это по-другому обыграть можно?.Но думаю этого будет достаточно.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
18.12.2023, 07:55
Цитата Сообщение от Yury Komar Посмотреть сообщение
Или может, на ваш взгляд это по-другому обыграть можно?
Я бы использовал стандартные средства для этого. Пишем в app.config
XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="DLL" />
    </assemblyBinding>
  </runtime>
</configuration>
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.12.2023, 09:22
А ведь можно просто хранить DLL в каталоге с программой без всяких упаковщиков, архиваторов и ресурсов.
Это избыточное усложнение.
А ещё требует прав администратора: запись в ProgramFiles пользователю запрещена.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
18.12.2023, 15:49
Цитата Сообщение от Замабувараев Посмотреть сообщение
А ведь можно просто хранить DLL в каталоге с программой без всяких упаковщиков, архиваторов и ресурсов.
Это избыточное усложнение.
Я не сторонник упаковки DLL в EXE, но кому-то это кажется правильным решением и это их право.

Цитата Сообщение от Замабувараев Посмотреть сообщение
А ещё требует прав администратора: запись в ProgramFiles пользователю запрещена.
В данном случае не требует. Вся работа идет в памяти.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2023, 15:49
Помогаю со студенческими работами здесь

UserControl. Как упаковать в DLL?
Доброго времени суток, уважаемые форумчане! Помогите, пожалуйста. Получила задание &quot;написать подключаемый модуль на с#, который бы...

Как User control упаковать в dll
Получил такое задание создать контрол и что бы он был в dll и как к его полям, если он в dll, получить доступ из формы??

Упаковать dll внутрь WPF приложения
Приветствую товарищи! в wpf новичок, и уже два дня ломаю голову и гугл поиском решения. :cry: Как же можно запеч внешние...

Можно ли упаковать ресурсы в exe?
Всем привет! Некоторое время назад делал консольное приложение с текстовым мини квестом. Сделал так, чтобы при запуске приложения...

Как сделать свой .dll содержащий иконки Windows? Или как упаковать всё в .dll
Всем привет, я решил заменить все иконки в windows(и вот не надо говорить, что так делать не хорошо) и мне нужно упаковать всё в .dll но не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru