Общая переменная между приложением C # и приложением VBA

1

У меня есть два приложения - приложение С# и приложение VBA. Я хотел бы создать переменную в каждом приложении, которая указывает на то же место в памяти. Цель состоит в том, что если я изменю значение в одном приложении, другое приложение сразу получит доступ к этому значению без какой-либо дополнительной логики для передачи этих данных между приложениями. В сущности, я хочу "дистанционно контролировать" значение переменной С# из приложения VBA.

Я не уверен, что это возможно, поэтому любая помощь очень ценится.

EDIT: Сейчас я рассматриваю несколько иной подход. Я могу использовать ненастроенный файл с памятью для передачи данных между двумя приложениями. Хотя для записи/чтения файла с отображением памяти потребуется некоторый код, он лучше, чем диск. Я переношу реальный номер между двумя приложениями (например, 1.2345). Не знаете, какой класс использовать - StreamWriter, StringWriter или TextWriter? Какие-либо предложения??

Спасибо.

  • 0
    Это очень широкий вопрос. В общем случае вы используете объект Cipboard для обмена значениями переменных между приложениями. Но в вашем случае, основываясь на упоминании «удаленного управления», это больше похоже на создание клиент-серверных приложений, для которых требуется гораздо больше кода. С Уважением,
  • 0
    Нет буфера обмена или намерения клиент-сервер. Все, что я хочу сделать, это контролировать одно и то же пространство памяти из двух разных приложений. Var "A" в приложении "A" использует ту же память, что и Var "B" в приложении "B". Вот и все.
Показать ещё 3 комментария
Теги:
memory-mapped-files

1 ответ

0

Вам нужно будет передать переменную по ссылке на ваш код в С#

Хотя я не пробовал это прямо в С#, эквивалент C++ того, что вы ищете, приведен ниже. Обратите внимание, что этот подход использует глобальные переменные и является очень грубым и потенциально опасным, поэтому будьте очень осторожны при работе с памятью таким образом. Я уверен, что могут быть более элегантные способы выразить это.

double* monitored_variable_global_pointer;

void __stdcall DoSomething(double &monitored_variable)
{
    // since monitored_variable is passed by reference, any change here, will change it on the VBA side, e.g.
    monitored_variable_global_pointer = &monitored_variable;
}
// On the VBA side, the passed variable will have to be global too for this to work.
// Also, you need the function calling convention to be stdcall for it to work with VBA, at least when making functions in C++

Когда код написан,

  1. Код C++ скомпилирован в DLL
  2. Затем функция вызывается один раз в VBA (предпочтительно инициируется событием, которое открывается рабочей книгой после объявления глобальной переменной)

Для достижения желаемого эффекта вам необходимо выполнить эквивалент этих шагов на С#.

  • 0
    Спасибо за этот совет - я рассмотрел этот подход, но приложение C # не поддерживает опцию компилятора / unsafe (требуется для получения доступа к указателям в C #). Я рассматриваю другой подход, который заключается в использовании файла непостоянной памяти. Еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню