web-dev-qa-db-fra.com

Comment ajouter une dépendance native native dll?

J'ai deux projets. Le premier est un projet d'application Windows Forms et le second est un projet de bibliothèque de classes. Un projet de bibliothèque classique fonctionne avec FANN . Windows Forms est un projet de démarrage. 

Je devrais avoir Fann.Net.dll et fanndoubleMT.dll pour travailler avec le FANN. J'ai téléchargé ces bibliothèques et les ai placées dans un dossier lib, situé à la racine de la solution.

J'ai ajouté Fann.Net.dll en tant que dll externe au projet de bibliothèque de classes. J'ai compilé le projet. J'ai reçu une erreur indiquant «Impossible de charger DLL 'fanndoubleMT.dll'. J'ai résolu cette erreur en ajoutant fanndoubleMT.dll dans le dossier Windows_Forms_Application\bin\Debug.

Je pense que ceci est une solution terrible au problème, parce que j'utilise git, et chaque fois que vous devez transférer des dll dans ce dossier sur le nouveau lieu de travail.

Cordialement, Denis.

20
Denis

Vous pouvez essayer ceci:

  1. Ajouter/Élément existant, au lieu d'ajouter Ajouter une référence.
  2. Utilisez Ajouter comme lien.
  3. Assurez-vous que l'élément doit être copié dans le dossier de construction. Dans la propriété de la bibliothèque dans VS, définissez Action de construction sur Contenu et Copier dans le répertoire de sortie pour Copier s'il est plus récent.
  4. Terminé. Reconstruire et tester.

Suggéré dans le lien http://social.msdn.Microsoft.com/Forums/en-US/1b1b316a-8648-4243-a651-84de51fd2508/reference-native-dll-from-managed-c-project?forum= vssmartdevicesvbcs .

31
liang

Vous pouvez ajouter la DLL native en tant qu'élément lié et utiliser " Copier si plus récent ".
Le problème avec les dll natives, est que parfois vous voudrez utiliser différentes dll en fonction de la configuration du projet (Debug/Release ou plateforme).

Vous pouvez éditer le fichier .csproj du projet et lier la dll native de façon conditionnelle:

 <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|Win32' ">
    <Content Include="..\..\..\..\..\bin\Win32\Release\fanndoubleMT.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
 </ItemGroup>   
 <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|Win32' ">
    <Content Include="..\..\..\..\..\bin\Win32\Debug\fanndoubleMT_d.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
    <Content Include="..\..\..\..\..\bin\x64\Debug\fanndoubleMT_d.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
    <Content Include="..\..\..\..\..\bin\x64\Release\fanndoubleMT.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

Notez que l'option de copie est définie sur PreserveNewest qui signifie "copie si nouvelle".

6
Yochai Timmer

Vous ne pouvez pas ajouter de référence aux dlls non gérées .. Une solution consiste à ajouter un événement post-construction à votre projet Windows Forms ..__ L'événement post-build peut également exécuter un fichier .cmd ou .bat

Vous avez toujours besoin de la référence à l'assembly géré, 'Fann.Net.dll'

5
Steven Licht

La solution ci-dessus écrite par liang ne fonctionne que pour la structure de projet plat! Vous souhaiterez peut-être organiser toutes vos DLL de votre solution dans un dossier nommé "Dependecies". Attention, les fichiers sont copiés par rapport à la structure du projet dans l'Explorateur de solutions. (testé avec Visual Studio 2015)

  1. Créer des dépendances de dossiers dans votre Explorateur de solutions
  2. Ajouter/Élément existant, au lieu d'ajouter Ajouter une référence.
  3. Utilisez Ajouter comme lien.
  4. Dans la propriété de la bibliothèque dans VS, définissez Action de construction sur Contenu et Copier dans le répertoire de sortie pour Copier s'il est plus récent.

Vous devriez maintenant avoir la structure suivante de Solution Explorer:

Your Project
- class1.cs
- Dependencies\Fann.Net.dll
- Dependencies\fanndoubleMT.dll

Ajouter l'étape postbuild:

xcopy "$(TargetDir)\Dependencies" "$(TargetDir)"  /s /e /h /Y

Cette solution combinant l'ajout de fichiers au projet et la création d'une étape de post-génération présente les avantages suivants:

  • Le projet est bien organisé
  • Pas besoin de modifier l'étape de post-génération si quelqu'un ajoute une nouvelle dépendance à la solution Explorer plus tard, 
  • Si vous utilisez Subversion, le drapeau en lecture seule du fichier verrouillé dans le référentiel sera réinitialisé
2
Tomas Kubes

Si la dll ne se trouve pas dans le fichier bin du projet, vous devez autoriser sa copie.

  1. Clic droit sur votre dll

  2. Cliquez sur les propriétés

  3. Si le répertoire de copie vers la sortie est Ne pas copier , sélectionnez Copier toujours

  4. Reconstruisez le projet. Il va apparaître.

0
Cüneyt Bozyel