【问题标题】:Sharing variable between C# and C在 C# 和 C 之间共享变量
【发布时间】:2013-07-26 03:47:15
【问题描述】:

我已经看到了一些几乎相同问题的答案,但没有 C# 代码可以帮助我理解。

我有一个注入内存的 C++ .DLL 文件。虽然,这个 DLL 只是从应用程序中获取信息,也从 C# .exe 中获取信息。

C#的exe信息每秒都会变化,而C++的信息只会变化一到两次。

如何在两个正在运行的应用程序之间创建共享变量,以及如何读取/写入它?

谢谢!

【问题讨论】:

  • 或许redis.io?
  • 嗯,不完全……解释得不是很好……我更多的是寻找可以放入内存的东西,比如结构或其他东西
  • 其实redis就是这样。它是一个内存共享结构服务器。它被设计为轻量级系统,用于填充可由多个进程访问的值。 API 很简单,几乎所有可以想象的语言都有客户端。您可以启动一个 redis 实例并让多个程序读取和写入,或者您可以在跨网络的进程可以访问的远程服务器上运行 redis。没有管理或用户访问列表,它只是存储和检索简单或复杂值的快速方法
  • 还有 ZeroMQ (zeromq.org),它的基础设施更少(没有服务器,库就是服务器),它允许您以多种语言连接进程,也可以选择跨网络连接(ZeroMQ不仅使用 TCP/IP,它还具有进程间共享)。不同之处在于 ZeroMQ 没有持久性,它更多的是事件驱动的数据传递,因此每个环境都将负责记住公共变量的最后一个值。

标签: c# c++ memory shared inject


【解决方案1】:

如果您想构建一个可靠的解决方案,您应该使用以下方法:

  1. 从 C# 到 C++ 函数的调用。保持参数类型尽可能简单。任何 C# 线程都可以进行这些调用。
  2. 启动您自己的 C++ 线程,这些线程仅读取/修改 C++ 数据并仅调用 C++ 方法和函数。
  3. 使用 Windows 内核对象进行同步和其他类似的东西。当一方发出事件信号而另一方等待它时,这很好。

其他类型的交互也是可能的,但我不鼓励使用它们。这些附加类型并不简单,也没有明确定义,包含警告等。上面的 3 种方法允许构建复杂的应用程序。

要调用 C++ 函数,请添加到您的程序集中:

[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType);

这告诉 User32 有你想要调用的入口点MessageBeep。之后,您可以将其用作任何其他功能:

MessageBeep(0);

以类似的方式,您可以调用GetProcAddress 或您自己的 DLL 中的任何其他入口点。

【讨论】:

  • 我该如何解决解决方案1?
  • 有什么特别不清楚的地方?尝试阅读:msdn.microsoft.com/en-us/magazine/cc164193.aspx
  • 问题是我认为我们使用 DllImport 在磁盘上的 Dll 上调用函数。现在的问题是我需要在两个正在运行的进程之间共享一个结构或一个变量。
  • 要在进程之间共享数据,您需要使用共享内存区域。这是完全不同的主题。
  • 我想过命名管道吗?
【解决方案2】:

我将使用命名管道,以便两个进程可以轻松地一起通信! (C# 服务器和 C++ 客户端)

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 2018-04-25
    • 2011-09-14
    • 2015-03-28
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多