2009-01-22 11 views
0

Ma solution est principalement C#, mais j'ai un projet C++ qui crée une DLL que mes appels de code C#. Voici la mise en page:Fichiers cible perdus dans Visual Studio 2008

[Modifié: il y a deux niveaux d'indirection, ce qui provoque le problème]

Nous appellerons la solution MySolution. Il a quatre projets:

 MySolution 
    MyCppDll (creates an unmanaged DLL) 
    MyCSharpWrapper (Managed wrapper for the unmanaged DLL) 
    MyCSharpLibrary (Contains classes that access the wrapper) 
    MyCSharpProgram (Creates classes from MyCSharpLibrary) 

Je les dépendances mis en place correctement afin que MyCppDll est compilé d'abord, puis l'emballage, la bibliothèque et le programme. Cependant, lors de la construction dans l'EDI, la sortie de MyCppDll n'est pas copiée dans le répertoire de sortie de MyCSharpLibrary.

Je peux contourner ce problème en créant une étape de post-construction pour MyCSharpLibrary, en le faisant copier MyCppDll.dll dans le répertoire MyCSharpLibrary \ bin \ Debug (ou \ Release). Mais quand MyCSharpProgram est compilé, il obtient les fichiers associés à l'encapsuleur et à la bibliothèque, mais il n'obtient pas la DLL. Encore une fois, je pourrais créer une étape post-construction pour le faire, mais c'est loin d'être idéal, pour plusieurs raisons.

La vraie solution a plusieurs dizaines de projets, dont beaucoup font référence à MyCSharpLibrary. La création d'une étape post-construction pour chacun est, comme vous pouvez l'imaginer, fastidieuse et sujette aux erreurs. Et chaque fois que j'ajoute un nouveau projet qui fait référence à cet assemblage, je vais devoir créer une autre étape post-construction.

Et cela ne devrait pas être nécessaire. Lorsque je compile cette solution à partir de la ligne de commande, la DLL est copiée à partir du répertoire MyCSharpLibrary comme prévu. En d'autres termes, à partir de l'IDE, le répertoire MyCSharpProgram \ bin \ Debug contient MyCSharpProgram.exe, MyCSharpLibrary.dll, MyCSharpWrapper.dll (plus les fichiers .pdb associés). Mais si je compile à partir de la ligne de commande (en utilisant MSBuild), le répertoire contient tout ce qui AND MyCppDll.dll.

Est-ce que quelqu'un d'autre a rencontré ce problème? J'utilise Visual Studio 2008 et n'ai pas encore mis à niveau vers SP1. [Edit - Le problème semble être que les fichiers ne sont pas copiés à moins qu'il n'y ait une référence directe du projet Program au projet Wrapper. Autrement dit, si j'ajoute une référence à MyCSharpWrapper dans le projet MyCSharpProgram, la DLL est copiée. Encore une fois, cela ne se produit que dans l'EDI. Il fonctionne très bien sans cette référence lors de la construction de la ligne de commande.]

+0

Downvoter? Il est d'usage de fournir un commentaire explicatif. –

Répondre

1

Nous avons eu des problèmes avec Visual Studio et C++ mixtes et les projets C# lors de l'utilisation Bât. Ensuite, nous sommes passés à utiliser seulement Reconstruire et cela a fonctionné. Vous avez probablement reconstruire à partir de la ligne de commande et construire dans l'EDI. Au fait, cette référence ne devrait pas être là, parce que le projet en dépend d'une façon ou d'une autre?

+0

Stefan a raison. Les références ne sont pas transitives. Vous devez ajouter la référence. –