2010-12-20 1 views
1

J'ai hérité d'un projet écrit principalement dans VB. Je voudrais maintenir ce que j'ai dans VB tout en convertissant lentement en C# quand je peux. La seule façon que j'ai trouvé pour faire ceci est de créer un projet C# séparé. Cependant, cela provoque des problèmes à cause des dépendances et des références. Je ne peux pas avoir VBProject référence CSharpProject et vice versa parce qu'il crée une référence circulaire. C'est un problème parce que j'ai besoin des deux projets pour pouvoir référencer l'autre. Y a-t-il un meilleur moyen de le faire, ou est-ce que je suis coincé en train d'écrire en VB (ou de traduire complètement en C#)?Division d'un projet VB/C# et références

De plus, ces projets sont dans la même solution. Ne devrais-je pas être capable de les importer/les utiliser sans créer de référence ou d'une autre manière plus facile?

Répondre

3

Il n'y a pas moyen de supprimer les références circulaires. Quand j'ai fait face à une situation similaire dans le passé, en convertissant de la langue A à la langue B, j'ai commencé par refactoriser les bits du langage A afin qu'ils soient indépendants de la majorité de la base de code. Ensuite, je traduisais ces morceaux isolés en langage B et je les intégrais pour que le programme principal dépende maintenant des nouveaux modules. Finalement, tout ce qui restait était le programme principal.

Cela a pris du temps, mais cette approche ascendante a été très efficace et j'ai fini avec un programme beaucoup plus modulaire.

1

Vous ne pourrez pas faire cela tant que le projet C# dépendra du projet VB.

Vous devez extraire des classes du projet VB.net dans le projet C# afin que les classes/fonctions soient autonomes et ne dépendent pas du projet VB.

C'est quelque chose que je lutte contre au travail tous les jours, et je me déplace lentement vers la lumière (C#)

1

Si vous ne pouvez pas extraire des éléments spécifiques dans le nouveau projet C# pour référence, alors vous Je vais devoir tout réécrire. S'il s'agit d'un projet d'application Web ou d'un projet Windows Forms, vous ne pouvez pas gérer un type d'hybride dans le même projet. Si vous avez un projet de site Web, vous pouvez spécifier la langue pour chaque page qui vous permettrait d'avoir un hybride. Ceci est extrêmement salissant, cependant, et vous vous trouverez bien mieux d'allouer le temps de réécrire tout en C# ou de s'adapter à l'écriture en VB.

2

Inversion de contrôle vous aidera grandement dans l'exécution d'une migration comme celle-ci. J'ai récemment abordé un problème similaire lorsque l'on m'a demandé d'ajouter des fonctionnalités significatives à du code VB.Net non testé. Je voulais extraire la fonctionnalité affectée existante de VB.Net et la mettre dans un ensemble C# testé unitairement. Dans les cas où vous souhaitez extraire une classe vers un nouvel assemblage mais rétablir des dépendances dans l'assembly d'origine, vous pouvez annuler cette opération en définissant une interface de contrat dans le nouvel assembly implémentée par les dépendances de l'assembly d'origine. Par exemple, classes Alpha, Bravo et Charlie dans l'assembly VB.Net, où Alpha fait référence à Bravo. Vous voulez extraire Bravo, mais il a une référence à Charlie. Définir une interface appelée ICharlie dans le projet C# qui contient les membres de Charlie dont s'occupe Bravo. Dans le projet VB.Net, modifiez Charlie: ICharlie. Lorsque vous construisez Bravo, il acceptera une dépendance de type ICharlie.

L'avantage de cette approche, même au sein du même projet ou ensemble de projets, est la testabilité.Les dépendances entre les classes sont bien connues et peuvent être remplacées par des mock/stubs afin que des classes comme Bravo puissent être testées sans avoir à s'inquiéter de sa mise en place avec une implémentation ICharlie réelle.

+0

Mais comment le projet VB sait-il ICharlie s'il se trouve dans le projet C#? – Jason

+0

Parce que le projet VB.Net fait référence au projet C#. Ou si vous voulez que le projet C# ait à la place une référence au projet VB.Net, vous définissez une interface IBravo dans le projet VB.Net que Bravo (C#) implémente. En général, je le laisse dans l'autre sens. Il peut y avoir une demi-douzaine ou plus d'interfaces définies pour les dépendances dans l'assembly C#, mais les seules modifications que vous devrez effectuer dans le code VB existant sont l'héritage des interfaces pour exposer les méthodes publiques existantes. –

Questions connexes