[C#][VSExpress 2005] Comportement curieux de l'IDE

D’abord le contexte: j’utilise un Visual Studio C# Express 2005.

J’ai deux projets dont l’un fait office de “client” et l’autre de “serveur”. Ces deux projets utilisent une Dll, qui dépend soit de XNA, soit d’une autre DLL mimant une partie du Framework XNA (pour le serveur, j’ai besoin des classes Vector3, etc…). J’ai deux fichiers csproj différents pour cette DLL naturellement, qui référencent soit XNA, soit ma DLL d’émulation. Les fichiers contenant le code de cette DLL sont communs, je fais une compilation conditionelle (avec un bon vieux #define) pour indiquer si je dois utiliser XNA ou la DLL.

On a donc d’un coté:
XNA + DLL commune compilée en client + client

Et de l’autre
Emulation XNA + DLL commune compilée en serveur + serveur

Tout se passe presque bien… sauf dans le cas suivant:

  • Je lance l’IDE avec le projet du client
  • Je lance l’IDE avec le projet du serveur
  • Je compile le serveur
  • Je lance le serveur en mode débogage
  • Je compile le client: ERREUR (voir en dessous)

Celui ci me cherche des référence sur la DLL d’émulation utilisée par le serveur. Cela ne me le fait que si le serveur est LANCE et mode débogage. Je peux lancer l’exe du serveur à la main, ca passe bien et je peux compiler sans problème le client. Le contraire est aussi vrai: si je compile + lance le client, la compilation du serveur va chercher des références à XNA. Ma DLL commune a pourtant deux répertoires de compilation différents: bin/Client/… et bin/Server/… donc je ne pense pas que ca soit du a un écrasement quelconque d’un fichier ?

Encore plus curieux, si je fais un “Rebuild All” sur le client alors que le serveur est lancé, la compilation va marcher, et le client se lancer (mais c’est un peu lourdingue de devoir à chaque fois recompiler le tout).

Etant un cas forcément un peu bizarre, Google n’a pas vraiment été mon ami sur ce coup là… Il est aussi fortement possible que je m’y prenne mal pour “partager” un code entre un client et un serveur ayant des dépendances que je ne souhaite pas retrouver sur le serveur (XNA), mais dans ce cas là, j’ai besoin de vos lumières pour savoir comment organiser mon code…

edit de punition pour moi: indiquer clairement les topics, la prochaine fois.

Je me réponds à moi même:

J’étais dans une fausse problématique, étant donné que à la base, j’aurai souhaité que le serveur tourne sous un linux (me demandez pas pourquoi). Après une discussion sur IRC avec AnA-L, il se trouve que toutes les classes et structures ne nécéssitant pas d’appel à l’hardware (donc les structure que je souhaitais récupérer, comme Matrix, Quaternion, et VectorX) fonctionnent sans problème sous linux, pour peu qu’on fournisse la Dll avec.

Donc je peux sans problème utiliser la même référence \o/.

Ps: merci à AnA-L ca m’ôte une sacré épine du pied.

Je réuppe le thread.

Bon ben finalement ca m’apprendra à pas vérifier les dires des gens, ca ne marche pas du tout. La question reste donc ouverte: comment utiliser deux références différentes dans deux projets similaires sans que la compilation se viande?

Note (pour les gens qui font XNA - oui c’est un message à peine caché pour GloP): ca serait bien de mettre toutes les fonctions mathématiques dans une Dll séparée qui tourne sous mono :).

Pour moi, ton besoin cache un problème de conception. Est-il normal qu’une librairie serveur référence des assemblies d’un Framework orienté client ? (car oui, XNA est un framework d’interaction avec l’utilisateur, orienté jeu vidéo, et est donc un Framework plutôt “client”).

J’imagine un cas trivial : je sais pas ce que c’est le jeu, mais la plupart de ceux qui ont un serveur “à part”, c’est principalement pour éviter la triche et s’assurer que tous les calculs (trajectoire, position, etc) sont bien les bons (et ca réduit le lag aussi) (pour faire super court).

Je suis tout à fait d’accord sur ce point, l’embettant étant que tu obtient une “adhérence” côté serveur au Framework XNA, ce qui pour moi est MAL.
Je suis certain qu’il y a moyen pour ce genre de choses de travailler avec des classes à toi. D’autant que vu que tes infos doivent transiter entre le client et le serveur, il doit y avoir un mechanisme de sérialization / désérialization (pas forcément celle “out of the box” .Net, mais quand même), et que tu dois donc pouvoir désérializer les messages côté serveur dans des types à toi.

Après pour la mise en commun de code entre client et serveur, tu peux toujours faire 2 projets “Class Library”, l’un référencant XNA et l’autre tes librairies serveur, et faire des “File Links” entre les 2 (clic droit sur ton projet, Add Existing Item, tu vas chercher le fichier de l’autre projet, et au lieu de cliquer sur le bouton “Add”, tu clic sur la petite fleche à côté et tu fais “Add as link”.

OK Merci, je vais tenter le “Add As Link” (si je l’ai sur ma version Express de l’IDE).