【问题标题】:C# - Communicate between two projects without two-way referencesC# - 在没有双向引用的情况下在两个项目之间进行通信
【发布时间】:2018-02-22 18:58:11
【问题描述】:

我有两个项目:项目 A 和外部项目 B(通过“在 Visual Studio 中添加现有项目”添加)。项目 A 有对项目 B 的引用,但项目 B 没有对项目 A 的引用。我有项目 A 中的一个 WinForm 文本框,我希望项目 B 能够向其中写入文本。因为项目 B 没有对项目 A 的引用,所以我无法调用我在项目 A 中创建的将文本添加到文本框。

我的问题:是否可以让项目 B 调用该方法或写入该文本框而不添加项目引用?

【问题讨论】:

  • 不知道为什么你需要一个循环引用(你不能)...通常项目 A 是 UI 而项目 B 是一个类库。您应该能够从项目 A 调用项目 B 中的逻辑来呈现数据。其他方法是 API、共享数据库等。您的具体用例是什么?
  • 考虑使用您要在其中重用的 winform 创建一个新的“通用”项目。这样项目 A 和 B 可以引用这个公共项目。另一种解决方案可能是使用 [link] (docs.microsoft.com/en-us/dotnet/framework/mef)
  • @LukeHutton 项目 A 是 UI。项目 A 调用项目 B 中的构造函数,该构造函数开始一些数据处理 - 我想使用项目 A 中的 UI 文本框向用户直观地显示处理信息。我正在开发安装程序 - 来自项目 B 的处理信息将是显示以让用户知道当前正在做什么。
  • 哦,我明白了,用例使它更清晰。有很多方法可以做到这一点。与其让项目 B 关心 UI,它实际上应该只做它的工作并报告它当前的进度(关注点分离)。 UI 将监听单独的线程并更新视图。参见IProgress 模式,例如simplygenius.net/Article/AncillaryAsyncProgress
  • 在项目B 中添加ProgressChanged 事件。然后在项目A 中为该事件附加一些逻辑。

标签: c# winforms visual-studio events delegates


【解决方案1】:

循环引用虽然在 C# 中是允许的,但通常是架构决策不佳的症状。这可能吗?

void MyEventFunction(object sender, EventArgs e)
{
    string txt = MyClassFromB.GetStringFromB();
    textBox1.Text = txt;
}

理想情况下,您希望 B 的代码在需要时只为您提供所需的字符串,以便 A 可以控制何时更新。

或者,您可以让代表参与进来。

在 B 中:

public class MyClass
{
    public delegate void UpdateStringVar(string x);
    private UpdateStringVar usv;
    MyClass(UpdateStringVar v)
    {
        usv = v;
    } 

    void ContinuouslyRunningOperation()
    {
        string status = //get some string
        usv(status);
    }
}

在 A 中:

void UpdateTextBox(string x)
{ 
    textBox1.Text = x;
}

MyClass myClass = new MyClass(UpdateTextBox);

如果你的整个应用程序是单线程的,这样的东西会起作用,但是 WinForms 控件有一个烦人的“只能从创建它的线程访问这个对象”的要求,所以如果你的 B 代码正在运行,则需要额外的工作不同的线程。

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2020-05-25
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多