Je fais de la maintenance sur une application Web asp.net qui utilise la communication à distance pour appeler un objet serveur distant afin de commander un rapport de solvabilité. L'appel "fonctionne sur ma machine" mais déclenche une exception "Impossible de charger le fichier ou l'assembly 'choicepointClue'" lorsqu'il est exécuté à partir du serveur de production (qui exécute la version 64 bits du framework .net)..net dépendance à distance/problème de référence
J'ai résolu le problème en copiant choicepointClue.dll dans le répertoire bin de l'application Web. Mais je ne comprends pas pourquoi il doit être là car c'est une dépendance de la bibliothèque du serveur distant et non du client.
L'arbre de dépendance ressemble à ceci:
application Web -> choicepointClueClient -> choicepointRemoteAgent -> choicepointClue
Il n'y a pas d'interface définie pour la classe dans la bibliothèque choicepointRemoteAgent (comme il devrait être) donc il est référencé directement par choicepointClueClient.
Une classe de choicepointRemoteAgent est instanciée à l'aide de Activator.GetObject(). C'est à ce stade que je m'attendrais à ce que choicepointClue.dll soit chargé sur le serveur distant au lieu de l'exécution essayant de le charger à partir du répertoire bin de l'application web.
Une théorie qui m'a traversé l'esprit est qu'il existe une différence entre la façon dont les assemblages sont chargés sur x64 vs x86.
Donc sur x64 il essaie de charger choicepointClue dès qu'il charge choicepointRemoteAgent, où sur x86 il n'essaye pas de charger chiocepointClue jusqu'à ce qu'il soit explicitement appelé?
Évidemment, je n'ai aucune idée de ce qui se passe ici. Quelqu'un peut-il nous éclairer là-dessus?
Les classes de choicepointClue.dll sont utilisées par choicepointRemoteAgent sur le serveur distant. Il me semble que le client devrait seulement besoin de connaître les informations de type pour choicepointRemoteAgent. Sinon, pourquoi cela fonctionnerait-il sur ma machine locale sans choicepointClue.dll? Au début, je pensais qu'il devait être trouvé ailleurs que dans le répertoire bin, mais j'ai vérifié qu'il n'existe nulle part localement. –
Où sont définis les types utilisés par choicePointClient? Normalement, vous avez besoin que les interfaces/classes "partagées" soient dans un assembly séparé, car ces types doivent être disponibles pour le client et le serveur. –
Les types utilisés par le client sont définis dans choicepointRemoteAgent. Il n'y a pas d'interface partagée dans un assembly séparé comme vous pouvez vous y attendre. Le choicepointRemoteAgent.dll existe sur le client et le serveur. –