我知道标题不是不言自明的,但这是我提出的最简单的标题。
基本上,我有一个.NET DLL和一个.NET表单应用程序。在这种形式中,我加载这个DLL并创建一个类,让我们说:
MyClass a = new MyClass();
我有:
public string DataBridge
{
get { return String.Empty; }
set { txtHistory.Text += value + "\r\n"; }
}
在我的表单中,我想访问MyClass中的这个DateBridge
字符串,该字符串位于我的.NET DLL中。
我不确定是否清楚,如果有一点您不明白,请告诉我。
答案 0 :(得分:1)
MyClass
需要提供表单的参考。
答案 1 :(得分:0)
您的.NET Forms应用程序必须具有对.NET dll的引用。如果您使用Visual Studio进行编程,只需在解决方案资源管理器中右键单击该项目,然后选择“添加引用”,找到包含MyClass的DLL。
由于您可以在一个解决方案中打开多个项目,您可以选择添加对MyClass项目的引用而不是DLL文件,这将确保您的MyClass中的更改将自动显示在.NET Forms项目中
如果您不使用Visual Studio,而是使用其他工具(例如SharpDevelop),请查看该工具的文档以了解如何添加另一个项目或dll的引用。
如果您根本不使用工具,但使用CSC.exe编译器编译代码,请参阅编译器的文档以了解如何在编译时包含对外部dll的引用。
答案 2 :(得分:0)
MyClass
无法了解您的表单(或您的表单不知道MyClass
),因为这会产生循环依赖。你需要通过双方都知道的事情。在这种情况下,接口或委托可能是合适的。不幸的是,c#不能创建属性的委托。
首先,我想要注意一些关于你的事情DataBridge
。
get { return String.Empty; }
如果您不需要使用结果,可以跳过getter并仅使用setter。set { txtHistory.Text += value + "\r\n"; }
,这是一个非常糟糕的设计,制定者不应该有这种副作用。如果您为一个设定者指定多次相同的值,您希望它产生的结果与您刚刚指定一次的结果相同
您的DataBridge
应该是一种方法(如DataBridgeAppend(string s)
)。如果您改为创建方法
public string DataBridgeAppend(string s)
{
txtHistory.Text += s + Environment.Newline;
// or even better txtHistory.AppendText(s + Environment.Newline);
}
您可以将课程更改为此
public class MyClass
{
private Action<string> _dataBridgeAppend;
public MyClass(Action<string> dataBridgeAppend)
{
_dataBridgeAppend = dataBridgeAppend;
}
public void DoStuff()
{
// stuff
_dataBridgeAppend("result"); // using the callback delegate to return stuff to the Form
}
}
从Form1 您实例化MyClass
就像这样
MyClass a = new MyClass(this.DataBridgeAppend);