Итак, после обнаружения , что класс Bitmap ожидает, что исходный поток останется открытым в течение всего срока службы изображения или растрового изображения, я решил выяснить, действительно ли класс Bitmap закрывает поток при его удалении.
Глядя на исходный код, классы Bitmap и Image создают экземпляр GPStream для обертывания потока, но не хранят ссылку ни на GPStream, ни на экземпляр Stream.
num = SafeNativeMethods.Gdip.GdipLoadImageFromStreamICM(new GPStream(stream), out zero);
Теперь класс GPStream (внутренний) не реализует метод Release или Dispose - ничего, что позволило бы GDI закрыть или удалить поток. А поскольку класс Image / Bitmap не хранит ссылку на экземпляр GPStream, кажется, у GDI, Drawing.Bitmap или Drawing.Stream нет абсолютно никакого способа правильно закрыть поток. .
Я мог бы создать подкласс Bitmap, чтобы исправить это, но, подождите, он запечатан.
Пожалуйста, скажите мне, что я ошибаюсь, и что MS не просто сделала невозможным написать код, который не пропускает ресурсы с их API.
LockBits
иMarshal.Copy
. Единственный способ убедиться в этом - начать сBitmap
объекта, созданного без каких-либо связанных ресурсов. - person Nyerguds   schedule 28.01.2018System.Drawing
в наши дни как бы показывает свой возраст, и его нельзя использовать повсеместно. - person Nyerguds   schedule 24.01.2021Windows.Forms
и хотите отображать изображения в общих элементах управления Windows, вы все равно застряли сSystem.Drawing
... - person Nyerguds   schedule 16.02.2021