Проблема доступа к общей памяти Windows между приложениями, работающими в разных сеансахC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Проблема доступа к общей памяти Windows между приложениями, работающими в разных сеансах

Сообщение Anonymous »

Описание
Я разрабатываю приложение-агент, которое обращается к общей памяти нескольких приложений. Установка включает в себя три приложения:
A: приложение WPF C#.

B: приложение Python — агент.
C (BLauncher): A C # Служба Windows, которая обновляет и перезапускает B, если она не запущена.
A: C#

Код: Выделить всё

public void UpdateInfo(String fieldName, T info) where T : struct
{
try
{

DataTag dataTag = new DataTag();
_accessor.Read(0, out dataTag);

FieldInfo fieldInfo = typeof(DataTag).GetField(fieldName, BindingFlags.Public | BindingFlags.Instance);
if (fieldInfo == null)
{
throw new ArgumentException($"Field '{fieldName}' does not exist in DataTag.");
}

if (fieldInfo.FieldType == typeof(T))
{
fieldInfo.SetValueDirect(__makeref(dataTag), info);
}
else
{
throw new ArgumentException($"Field '{fieldName}' is of type {fieldInfo.FieldType}, not {typeof(T)}.");
}

_accessor.Write(0, ref dataTag);
}
catch (Exception e)
{
Console.WriteLine($"Error: {e.Message}");
}

}
Б: Python

Код: Выделить всё

    def connect(self):
if self.shm is None:
try:
self.shm = shared_memory.SharedMemory(name=self.memory_segment_name, create=False)
logger.info(f"Successfully connected to shared memory segment: {self.memory_segment_name}")
except FileNotFoundError:
logger.error(f"Error: Shared memory segment '{self.memory_segment_name}' not found.")

self.shm = None
except Exception as e:
logger.error(f"An unexpected error occurred: {e}")
self.shm = None
Среда
  • ПК1: Мой ноутбук под управлением Windows 11 с одной учетной записью пользователя. Доступ к общей памяти здесь работает правильно.
  • ПК2: компьютер под управлением Windows 10 с двумя учетными записями пользователей: Hello и eHello. На этом компьютере возникают проблемы с общей памятью.
Проблема
На ПК1 (одна учетная запись пользователя) приложение A пишет ~2000 байт данных в сегмент общей памяти с именем «MACHINE_INFO». Приложение Б успешно считывает данные при запуске как скрипт Python или как отдельный .exe-файл.
Однако на ПК2 (с двумя учетными записями пользователей) происходит следующее:
  • Приложение C (служба Windows, работающая под учетной записью System) запускает B как .exe-файл.
  • B сообщает, что сегмент общей памяти «MACHINE_INFO» не существует.
Ключевая информация
  • Я подозреваю, что это может быть связано с тем, как общая память работает между сеансами в Windows. Предыдущее обсуждение показало, что общая память зависит от сеанса, но я не уверен, что это полностью объясняет проблему.
  • C запускается как служба Windows под системной учетной записью.
  • Может ли приложение WPF (A) записывать в сегмент общей памяти, к которому имеет доступ системная учетная запись (и, следовательно, C)?
Вопросы
  • Да Windows обрабатывает общую память в зависимости от сеанса, что может привести к тому, что сегмент «MACHINE_INFO» будет недоступен во всех сеансах?
  • Как настроить или реализовать общую память, чтобы она была доступна для всех сеансов, особенно для приложений, работающих под системной учетной записью?
Будем очень признательны за любые рекомендации и предложения!

Подробнее здесь: https://stackoverflow.com/questions/792 ... -different
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»