C#应用程序和VBA应用程序之间的共享变量

C#应用程序和VBA应用程序之间的共享变量,c#,vba,memory-mapped-files,C#,Vba,Memory Mapped Files,我有两个应用程序——一个C#应用程序和一个VBA应用程序。我想在每个应用程序中创建一个指向相同内存位置的变量。其目的是,如果我更改一个应用程序中的值,另一个应用程序将立即访问该值,而无需在应用程序之间传输该数据。本质上,我想从VBA应用程序“远程控制”C#变量的值 我不确定这是否可行,因此非常感谢您的帮助 编辑:我现在正在考虑一种稍微不同的方法。我可以使用非持久内存映射文件在两个应用程序之间传输数据。虽然写/读内存映射文件需要一些代码,但它比磁盘i/o要好。我正在两个应用程序之间传输一个实数(例

我有两个应用程序——一个C#应用程序和一个VBA应用程序。我想在每个应用程序中创建一个指向相同内存位置的变量。其目的是,如果我更改一个应用程序中的值,另一个应用程序将立即访问该值,而无需在应用程序之间传输该数据。本质上,我想从VBA应用程序“远程控制”C#变量的值

我不确定这是否可行,因此非常感谢您的帮助

编辑:我现在正在考虑一种稍微不同的方法。我可以使用非持久内存映射文件在两个应用程序之间传输数据。虽然写/读内存映射文件需要一些代码,但它比磁盘i/o要好。我正在两个应用程序之间传输一个实数(例如1.2345)。不确定要使用哪个类--StreamWriter、StringWriter或TextWriter?有什么建议吗


谢谢。

您需要通过引用C语言中的代码来传递变量#

虽然我没有直接在C++中尝试过,但是下面给出的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++
一旦代码编写完成

C++代码编译成DLL
  • 然后在VBA中调用该函数一次(最好由声明全局变量后打开工作簿的事件触发)

  • 为了达到预期的效果,您需要执行与C中的这些步骤相同的操作。

    这是一个非常广泛的问题。通常,您使用Cipboard对象在应用程序之间共享var值。但在你的例子中,提到“远程控制”似乎更像是构建客户端-服务器应用程序,这需要更多的编码。注意,没有剪贴板或客户端-服务器意图。我只想从两个不同的应用程序控制相同的内存空间。应用程序“A”中的变量“A”与应用程序“B”中的变量“B”使用相同的内存。就这些。那个C#应用程序是Office插件吗?还是一个独立的应用程序?VBA代码在哪里执行?C#应用程序是独立的。不支持不安全代码。VBA可以从任何Office应用程序执行,虽然我更喜欢Access。您可以将您的C应用程序中的类暴露为COM对象,然后使用VBA内的COM对象传递变量的值。谢谢您的提示——我确实考虑过这种方法,但是Cype应用程序不支持/不安全编译器选项。(访问C#中的指针时必需)。我正在考虑另一种方法,即使用非持久内存映射文件。再次感谢。