【问题标题】:How to share variable between two c# projects [duplicate]如何在两个c#项目之间共享变量[重复]
【发布时间】:2013-02-16 22:24:51
【问题描述】:

我想在两个不同的项目之间使用共享变量,并且我想每次在 c# 中更新该变量? 我使用 dll 文件来共享一个变量,但在更新变量时它没有工作。请帮忙。

public static class Signals
{
public static bool Admin_Logged_In;
public static bool get_Admin_Flag()
{
    return Admin_Logged_In;
}
public static bool get_Busy_Flag()
{
    return Back_End_Busy;
}
}

我在 DLL 文件中附加了上述类并在两个不同的项目中引用,然后尝试在一个项目中更新值并期望在第二个项目中获得更新的值。但它不提供更新的价值。

【问题讨论】:

  • 你能分享一些代码吗?
  • 为什么要使用变量?文件呢?或数据库。
  • 我经常更新这个变量,所以我想一个变量为什么每次都打开和关闭一个文件。
  • 这两个不同的项目是同一个可执行文件的一部分吗?即,是否有一个可执行文件碰巧引用了两个项目(dll),或者一个可执行文件碰巧引用了另一个项目?可以同时运行程序的多个副本吗?如果在不同的机器上有多个副本怎么办?您需要更准确地指定“共享变量”的含义以及项目的关联方式以及它们的执行方式。
  • 实际上有2个不同的exe是互斥的,由共享变量决定

标签: c#


【解决方案1】:

链接文件怎么样(点击项目->添加->现有项目->(选择you.cs)->添加为链接)?

【讨论】:

  • 我也试过了.. :(
【解决方案2】:

您正试图通过同一程序中的两个项目访问静态成员,对吗?不是两个独立的程序。

如果是这样,我认为您在值类型和引用类型之间存在误解。您可以从两个项目中更新共享变量,但这些值不会传播。我将使用一个类来演示,而不是您使用的两个。

static class Test
{
    public static bool logged_in;
}


Test.logged_in = true;
var t = Test.logged_in;
Console.WriteLine(l); // prints true
Test.logged_in = false;
var f = Test.logged_in;
Console.WriteLine(f); // prints false
Console.WriteLine(t); // prints true

注意当您更改静态成员时t 的值没有更新?那是因为bool 是值类型,而不是引用类型。因此,当您请求该值时,您会收到该值的副本,而不是对变量的引用。

如果静态成员是引用类型,您可以观察到不同的行为:

static class Test
{
    public static string logged_in;
}


Test.logged_in = "true";
var t = Test.logged_in;
Console.WriteLine(l); // prints "true"
Test.logged_in = "false";
var f = Test.logged_in;
Console.WriteLine(f); // prints "false"
Console.WriteLine(t); // prints "false"

【讨论】:

  • 你说的是正确的..仍然无法正常工作..
  • @USER123,请下定决心,根据此评论,您是否有两个单独的过程,如您原来的问题一样?
  • 我有两个独立的进程(我的意思是 exe),它们指的是一个共同的标志(你可以说一个信号量)
【解决方案3】:

MS 文档中关于 DLL 的声明:“默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局变量和静态变量的实例。”。

看看这个可以提供一些解决方法:http://msdn.microsoft.com/en-us/library/h90dkhs0(v=vs.80).aspx

顺便说一句,我会使用网络通信来分享这些价值观。

【讨论】:

    【解决方案4】:

    如果您有两个需要通信的进程(例如两个 .exe 文件),则称为inter process communication。真的没有简单的方法来解释,因为有上百万种不同的方法来处理这个问题。

    • 您可以写入文件并读取它们。
    • 您可以通过网络连接进程。
    • 您可以对通用数据库进行读写操作。
    • 您可以使用消息队列。
    • 您可以使用命名管道。
    • 我可能还错过了另外十几种方式...

    您需要重新研究它们并找到最适合您的问题的解决方案。

    【讨论】: