Получить дистанционное растровое изображение, используя диск HBitMap в C #

StackOverflow https://stackoverflow.com/questions/3674638

  •  01-10-2019
  •  | 
  •  

Вопрос

у меня есть MarshalByRefObject Что мне нужно было сериализовать и хранить (в базе данных), поэтому я мог бы десерифицировать и ссылаться на него позже. Я решил подойти к этому по-другому: прямо сейчас я управляю службой Windows, которая просто сохраняет MarshalByRefObjects «живой» (обратите внимание, что RemoteObject на самом деле 3-й партийный объект, который я не создаю себя):

// This is the object which extends the MarshalByRefObject class
RemoteObject myRemoteObject = new RemoteObject;

TcpServerChannel channel = new TcpServerChannel(6789);
ChannelServices.RegisterChannel(channel, true);

ObjRef objRef = RemotingServices.Marshal((System.MarshalByRefObject)myRemoteObject, id);

В другом Appdomain я просто подключаю и извлекаю объект; Все работает нормально:

RemoteObject myLocalObject = (FCEngine.IFCVerificationSession)Activator.GetObject(
                           typeof(FCEngine.IFCVerificationSession),"tcp://localhost:6789/" + id);

Теперь проблема в том, что RemoteObject содержит свойство, которое просто HBITMAP ручка литая к long тип. Я могу легко получить ручку. Обычно (локально) я бы сделал:

IntPtr hbitmap = (IntPtr)myLocalObject.ContextImage;
System.Drawing.Bitmap bmp = System.Drawing.Image.FromHbitmap(hbitmap);

Это не работает в текущем случае. Я получаю System.Runtime.InteropServices.ExternalException Я думаю, проблема в том, что hbitmap Является ли дерьма для некоторой памяти, которая не существует в местном Appdomain, но в Windows Service Appdomain. Мой вопрос в том, что мои варианты:

  • То RemoteObject Это довольно сложный, это как дерево, в котором вы проходите узлы, вызывая свои функции. 3-я сторона накладывает, что я могу только пересекать объект один раз. Таким образом, прохождение IT Service-Side, хранение растровых изображений в базе данных, и пересекание ее удаленно снова не будет работать.
  • Идеал будет иметь возможность вызвать функцию в службе Windows и пройти диск HBitMap в качестве аргумента, возвращая фактическое растровое изображение. Это невозможно в услугах Windows.
  • Я мог хранить ручку в базе данных и сделать запрос сервиса Windows для нее. Затем он может получить растровое изображение и хранить его в том же дБ для меня. Затем я снова мог удаленно получить это растровое изображение. Это очень уродливо, так как мне нужно немедленно растровое изображение.

В основном я хотел бы знать, если у вас есть предложения не должны выполнять уродливые взлома, такие как 3-й вариант ... Каковы мои варианты?

РешаетсяСейчас я решил проблему, создав пользовательский объект, который расширяет MarshalbyRefobject на стороне обслуживания. Этот объект имеет способ извлечения и сохранения растрового изображения, передавая ручку. Я просто подходим к объекту удаленно, так же, как я приближаюсь к моему третьему объекту. Слишком просто из решения, хотя коллега должен был указать.

Это было полезно?

Решение

HBitMap - это ручка, у нее нет смысла сериализовать неуправляемые ручки. Вам необходимо сериализировать содержимое растрового изображения, воссоздать его (растровое изображение) на удаленной стороне, а затем повторно назначить вновь созданное hbitmap.

PS Физически дескриптор является указателем на указатель, его значение применимо только в адресное пространство было создано.

ПО МОЕМУ МНЕНИЮ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top