0

Notre solution a été configurée pour que Project A Références Project B, Projet B référence Project C et Project C disposent d'un wrapper .NET qui fait référence aux DLL natives.Dépendances conditionnellement copiées MSBuild

A -> B -> C -> via DLL natifs Wrapper .NET

La raison de la convolution est que nous avons affaire avec le matériel 3ème partie, ou nous renverrait les DLLs directement du projet B. Quoi qu'il en soit - -

Nous essayons d'obtenir des fichiers (DLL natifs) qui sont référencés dans le projet C, copié sur le projet A. Copie action locale avec accumulation de « contenu » ne fonctionne pas parce MSBuild échouera en disant qu'il ne peut pas écraser les fichiers car une fois qu'ils démarrent, les processus ne nettoient pas après eux-mêmes et restent en cours d'exécution.

  1. Est-il possible que MSBuild tente de tuer des processus avant de les construire?

    OU

  2. Est-il possible de copier conditionnellement les DLL natives du projet B au projet A si elles n'existent pas avec MSBuild? Le dossier bin du projet A est d'où ils sont lancés, et c'est là que la construction échoue (pas du projet C vers B).

Répondre

1

Il semble que votre problème principal est que votre application ne nettoie pas après elle-même. Si votre application démarre les processus, elle doit les arrêter lorsqu'elle est fermée. Vous devriez appeler Process.Kill() sur tous les processus que vous avez démarrés avant la fermeture de votre application.

Cela dit, à la fois 1) et 2) sont possibles:

1) On peut appeler un fichier exécutable à partir de msbuild utilisant le Exec task. Vous pouvez utiliser cette tâche pour appeler la commande "taskkill".

<Target Name="BeforeBuild"> 
    <Exec Command="taskkill /IM ProcessToKill.exe /F"/> 
</Target> 

2) Le msbuild Copy task a un paramètre « SkipUnchangedFiles » qui ne copier des fichiers si les fichiers sont plus récents que les fichiers existants:

<Target Name="AfterBuild"> 
    <Copy 
     SourceFiles="@(DllLocation)" 
     DestinationFolder="@(DllLocation->'$(OutputDir)%(RecursiveDir)%(Filename)%(Extension)')" 
     SkipUnchangedFiles="true" 
    /> 
</Target> 
+0

j'ai pu obtenir le processus de nettoyage après lui-même en utilisant: 'Exec Command =" taskkill/fi " IMAGENAME eq ProcessToKill.exe "/F "" comme si le processus n'était pas exécuté, une erreur serait levée avec le commutateur/IM. En outre, l'ajout d'une référence du projet A au projet C était nécessaire pour empêcher la suppression des DLL. Merci pour l'aide! – Clark