Le délégué à une méthode d'instance ne peut pas avoir null 'this'
Je développe en C# .NET 2.0 de l'application dans laquelle au moment de l'exécution de l'une des deux Dll sont chargées en fonction de l'environnement. Les deux Dll contiennent les mêmes fonctions, mais ils ne sont pas liés à la même adresse d'offset. Ma question est au sujet de la fonction des délégués dans mon code de l'application.
public class MyClass
{
public delegate int MyFunctionDelegate(int _some, string _args);
public MyFunctionDelegate MyFuncToCallFrmApp;
public MyClass() : base()
{
this.MyFuncToCallFrmApp = new MyFunctionDelegate(this.MyFuncToCallFrmApp); //<-- Exception thrown here.
}
public SomeFunction()
{
MyFuncToCallFrmApp(int _someOther, string _argsLocal);
}
}
Quand mon code s'exécute, je reçois un ArgumentException
de "Déléguer à une méthode d'instance ne peut pas avoir la valeur null 'cette'." Ce que je fais mal?
source d'informationauteur Jim Fell
Vous devez vous connecter pour publier un commentaire.
Vous devez attribuer une fonction valide (hébergé par une classe dans le chargement dynamique des dll) pour votre délégué variable. Si les fonctions sont des méthodes statiques de classes avec la même nomc'est simple:
Si les fonctions sont les méthodes d'instance de classes avec le même nom, il suffit de créer une instance et faire la même chose (à noter également que, tant que le délégué est dans la portée, il permettra d'éviter la
ExternalClass
instance de garbage collector - vous pouvez stocker l'instance en tant que membre de la variable pour le rendre plus clair):Si l'chargées dynamiquement les classes ont des noms différents, vous aurez besoin de déterminer qui de l'une à l'appel dans cet exemple, je suis à l'aide d'un booléen variable de membre de décider si ou de ne pas utiliser une valeur par défaut de l'assemblée de classe:
Dans votre ligne:
Vous utilisez ".MyFuncToCallFrmApp" avant de le céder, ce qui signifie qu'il est null au moment de la cession. Faire un délégué point à lui-même n'a pas de sens. Est-ce que vous essayez de faire?
Que vous essayez de créer une nouvelle instance d'un délégué à l'aide de la non initialisée instance du délégué qui est déjà dans votre classe...ce qui n'a pas de sens.
Vous devez initialiser le délégué à l'aide d'une méthode à partir de votre classe qui correspond à un les arguments de la liste que votre délégué ou de ne pas initialiser le délégué et de permettre au consommateur de votre classe afin d'initialiser le délégué à l'aide de la méthode d'appariement à partir de leur code (qui est ce que les délégués sont normalement utilisés pour les):
Jim, je suis en train d'apprendre les délégués en C# moi-même.
Un problème avec votre code, c'est que vous n'avez pas attribué le délégué d'une ordonnance d'un gestionnaire. La signature du délégué doit être assortie d'une ordonnance d'un gestionnaire avec la même signature de la méthode.
Dans la ligne:
this.MyFuncToCallFrmApp
est un délégué, mais il doit être une méthode valable gestionnaire de la place.Ici est de savoir comment vous passez par un gestionnaire de méthode:
J'espère que le lien ci-dessous et le code de l'échantillon sera de peu d'aide pour vous:
Les Délégués Tutoriel
Vous essayez d'initialiser le délégué à l'appel lui-même. Ce que vous faites fondamentalement n'a pas de sens.