2010-11-13 87 views
0

我知道标题不是自我解释,但这是我想出的最简单的一个。使DLL访问外部类对象

基本上,我有一个.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

您的.NET Forms应用程序必须具有对.NET dll的引用。如果使用Visual Studio进行编程,只需在解决方案资源管理器中右键单击项目,然后选择“添加引用”,然后找到包含MyClass的DLL。

由于您可以在一个解决方案中打开多个项目,因此您可以选择添加对MyClass项目而不是DLL文件的引用,这将确保您的MyClass中的更改自动在您的.NET Forms中可见项目。

如果您不使用Visual Studio,但使用其他工具(例如SharpDevelop),请参阅该工具的文档以了解如何为其他项目或dll添加引用。

如果您根本不使用工具,但使用CSC.exe编译器编译代码,请参阅编译器的文档以了解如何在编译时包含对外部dll的引用。

+0

虽然这是正确的它没有解决设计中固有的缺陷导致两个项目之间的循环依赖关系。 – 2010-11-13 17:22:54

1

MyClass将需要您的表单的参考。

0

MyClass无法了解您的表单(或您的表单不知道MyClass),因为这会创建循环依赖关系。你需要传递双方都知道的东西。在这种情况下,接口或委托可能是合适的。不幸的是,c#不能创建委托给属性。

首先我想说明一些关于你的事情DataBridge

  1. get { return String.Empty; }如果你不需要使用结果,你可以跳过getter并且只使用setter。
  2. set { txtHistory.Text += value + "\r\n"; },这是一个相当不好的设计,制定者不应该有这种副作用。如果您多次指定一个setter相同的值,您希望它产生与刚分配一次相同的结果。
    您的DataBridge应该是一种方法(如DataBridgeAppend(string s))。

如果您而是创建一个方法

public string DataBridgeAppend(string s) 
{ 
    txtHistory.Text += s + Environment.Newline; 
    // or even better txtHistory.AppendText(s + Environment.Newline); 
} 

您可以从Form1的类改变这种

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 
    } 
} 

你实例MyClass这样

MyClass a = new MyClass(this.DataBridgeAppend);