C# - 在没有双向引用的情况下在两个项目之间进行通信

问题描述:

我有两个项目:项目A和外部项目B(通过在Visual Studio中添加现有项目添加)项目A对项目B有引用,但项目B没有对Project A的引用我在Project A中有一个WinForm Textbox,我希望Project B能够写入文本,因为Project B没有对Project A的引用,所以我不能调用方法我在一个项目创建的文本添加到文本框C# - 在没有双向引用的情况下在两个项目之间进行通信

我的问题:?是否有可能有项目B调用该方法或写入文本框没有添加项目引用

+0

不知道为什么你需要一个循环引用(你不能)...通常项目A是UI和项目B是一个类库。您应该能够从项目A调用项目B中的逻辑来呈现数据。其他方法是API,共享数据库等。您的具体用例是什么? –

+1

考虑用你想要在其中重用的winform创建一个新的“通用”项目。这样项目A和B可以参考这个常见的项目。另一种解决方案可能是使用[链接](https://docs.microsoft.com/en-us/dotnet/framework/mef/) – 4D1C70

+0

@LukeHutton项目A是UI。项目A调用项目B中的构造函数,启动一些数据处理 - 我想使用项目A中的UI文本框向用户显示处理信息。我正在处理一个安装程序 - 项目B的处理信息将会是显示以让用户知道当前正在做什么。 – Roka545

循环引用虽然在C#中允许,但往往是糟糕的体系结构决策的症状。这可能吗?

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

理想情况下,你会希望B的代码,只是给你想要的,当你需要它的字符串,所以当它被更新一个可以控制的。

或者,您可以得到涉及的代表。

在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); 
    } 
} 

在答:

如果你的整个应用程序是单线程
void UpdateTextBox(string x) 
{ 
    textBox1.Text = x; 
} 

MyClass myClass = new MyClass(UpdateTextBox); 

像这样的工作,但WinForms控件有恼人的“只能访问该对象创建它的线程“的要求,所以如果你的B代码运行在不同的线程上,那么额外的工作将是必需的。