2010-11-13 1 views
0

Je suis conscient que le titre n'est pas explicite mais c'est le plus simple que j'ai trouvé. Fondamentalement, je suis un DLL .NET et une application de formulaires .NET. Sous cette forme, je charge cette DLL et créer une classe disons:Faire une DLL pour accéder à un objet de classe externe

MyClass a = new MyClass(); 

Je:

public string DataBridge 
{ 
get { return String.Empty; } 
set { txtHistory.Text += value + "\r\n"; } 
} 

dans ma forme et je veux accéder à cette chaîne DateBridge au sein MyClass qui est situé à l'intérieur de mon DLL .NET.

Je ne sais pas si c'est clair, faites-moi savoir s'il y a un point que vous n'avez pas compris.

Répondre

0

Votre application .NET Forms doit disposer d'une référence à la DLL .NET. Si vous programmez avec Visual Studio, vous pouvez simplement cliquer avec le bouton droit sur le projet dans l'Explorateur de solutions, puis choisir "Ajouter une référence" et trouver la DLL contenant MyClass. Puisque vous pouvez avoir plusieurs projets ouverts dans une solution, vous pouvez choisir d'ajouter une référence à votre projet MyClass plutôt que le fichier DLL, cela vous assurera que les changements dans votre MyClass seront automatiquement visibles dans vos formulaires .NET projet.

Si vous n'utilisez pas Visual Studio, mais un autre outil (par exemple SharpDevelop), veuillez consulter la documentation de cet outil pour savoir comment ajouter une référence à un autre projet ou dll.

Si vous n'utilisez pas du tout d'outil, mais utilisez le compilateur CSC.exe pour compiler votre code, consultez la documentation du compilateur pour savoir comment inclure une référence à une DLL externe au moment de la compilation.

+0

Bien que ce soit correct , il n'aborde pas le défaut inhérent à la conception qui provoque une dépendance circulaire entre les deux projets. –

1

MyClass devra avoir une référence de votre formulaire.

0

MyClass ne peut pas connaître votre formulaire (ou votre formulaire ne connaît pas MyClass) car cela créerait une dépendance circulaire. Vous devez transmettre quelque chose que les deux parties connaissent. Une interface ou un délégué pourrait convenir dans ce cas. Malheureusement, C# ne peut pas créer de délégués aux propriétés.

D'abord je veux noter quelques choses sur vous DataBridge.

  1. get { return String.Empty; } Si vous n'avez pas besoin d'utiliser le résultat, vous pouvez ignorer le getter et utiliser uniquement le setter.
  2. set { txtHistory.Text += value + "\r\n"; }, ceci comme une conception assez mauvaise, les setters ne devraient pas avoir ce genre d'effets secondaires. Si vous attribuez à un setter la même valeur plusieurs fois, vous vous attendez à ce qu'il produise le même résultat que si vous l'aviez attribué une seule fois.
    Votre DataBridge devrait plutôt être une méthode (comme DataBridgeAppend(string s)).

Si vous créez à la place une méthode

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

Vous pouvez modifier votre classe à ce

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

de Form1 instanciation MyClass comme celui-ci

MyClass a = new MyClass(this.DataBridgeAppend); 
Questions connexes