J'utilise Visual Studio 2008 pour créer une solution avec deux projets: une console C# App et une DLL C++. Je veux que l'application appelle une fonction de la DLL en utilisant P/Invoke. Par conséquent, j'essaie d'ajouter la DLL comme référence à l'application C#. Mais lorsque j'essaie la commande Ajouter une référence, Visual Studio ne me laisse pas le faire sauf si j'ai défini la propriété/clr sur la DLL (sous Propriétés de configuration: Général). Maintenant, je pensais que P/Invoke pouvait gérer les dlls win32. En effet, si je construis ma DLL sans/clr et que je la copie à la main dans bin/Debug, l'application fonctionne bien. Alors, pourquoi/clr est-il nécessaire d'ajouter la DLL comme référence? Et si VS ne me laisse pas l'ajouter, existe-t-il une solution de contournement (propre) pour que mon application trouve la DLL?Ajouter une référence d'une application C# à une DLL compilée sans/clr?
Je vois que quelqu'un a eu un problème similaire ici (mais avec une DLL tierce): Unable to add a DLL Reference to VS 2008 La réponse qu'il a eu était de construire un wrapper. Mais ce n'est pas vraiment nécessaire, car l'application peut très bien utiliser la DLL; c'est juste l'étape Add Reference qui ne fonctionne pas. Et d'ailleurs, le code de wrapper n'aura-t-il pas besoin d'une référence à la DLL, soulevant le même problème qu'avant? Je voudrais vraiment une réponse qui n'implique pas d'écrire un emballage du tout. Lors de l'utilisation de PInvoke sur une DLL C++, il n'est pas nécessaire d'ajouter une référence.
J'ai écrit une étape de pré-construction pour l'application C# en utilisant cette ligne de commande: Copier "$ (SolutionDir) Debug \ MathDll.dll" "$ (TargetDir)". Hélas, je souhaite que la fonctionnalité "Ajouter une référence" fonctionne, car maintenant je dois maintenir cela, et je suppose que cela sera différent pour les versions de versions ... Je ne vois pas vraiment pourquoi "Ajouter une référence" ne devrait pas gérer ce genre de chose. –
Je viens de trouver une façon un peu plus propre de le faire. Plutôt que d'utiliser une commande DOS pré/post-build, j'ai ajouté la dll au projet C# en tant que "Item existant". Ensuite, sous ses propriétés, j'ai défini "Copier dans le répertoire de sortie" sur "Copier si plus récent". (Son "Build Action" est "Content.") Cela me semble encore un peu hackish, mais au moins il corrige le problème Debug-vs-Release, et c'est un peu plus facile à repérer. –
Oups - J'ai réalisé que ma deuxième solution de contournement ne résout pas le problème Debug-vs-Release, parce que j'ai référencé la DLL du dossier Déboguer. D'un autre côté, la première solution de contournement peut gérer ce problème en modifiant la commande pour copier "$ (SolutionDir) $ (Configuration) \ MathDll.dll" "$ (TargetDir)". –