Reliant le C++ DLL avec la gestion bibliothèque de classes C++ DLL

Comme dans la question La création simple de c++.net wrapper. Étape-par-étape

Je suis tring à utiliser des classes C++.NET
mais j'ai des problèmes de construction dans Visual Studio (2008).

J'ai un non géré classe A (C++ compilé avec /clr).
J'ai créé un C++/clr classe "Class1" qui encapsule Une et avec correspondance
méthode des délégués à Une de ses méthodes.

Si je classe Une unité du fichier source dans la bibliothèque de classe
projet de Class1 (réussi) je n'ai pas de problèmes
tout les liens et fonctionne très bien,
Mais j'ai beaucoup de C++ classes comme A, et je suis tring pour les mettre dans
une DLL et lien DLL à la gestion de la bibliothèque (de la classe des wrappers).
[En fait, je ne vois pas nécessaire de lier ces DLL, ensemble, à ce stade,
mais le compilateur semble l'exiger, donnant les mêmes erreurs qui s'affichent ci-dessous.]

J'ai créé VisualC++ /CLR /bibliothèque de Classe
et ajouté ma classe C++ (Un énumérés ci-dessous) et de construire.
[J'ai utilisé les paramètres par défaut, mais
dans le projet de l'éditeur de liens paramètres j'ai essayé les deux
Registre de sortie avec oui et non.]
Il n'y avait pas d'erreurs et que la .DLL fichier a été créé.

J'ai créé VisualC++ /CLR /bibliothèque de Classe
et créé la classe wrapper 'Class1'
J'ai utilisé tous les paramètres par défaut.
Sous propriétés du projet j'ai cliqué sur "Références" Ajouter une Référence"
et sélectionné la DLL créé dans la première étape.

Je reçois des erreurs d'édition de liens:

test_NET_library.obj : error LNK2028: unresolved token (0A000009) "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2028: unresolved token (0A00000A) "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
C:\temp\test_Cpp_CLI\test_NET_library\Debug\test_NET_library.dll : fatal error LNK1120: 4 unresolved externals

Les mêmes erreurs que si je supprime A.cpp dans le wrapper projet de bibliothèque de classes (l'option qui vous convient).
Je ne comprends pas pourquoi la version est en essayant de résoudre des externes en premier lieu
parce que c'est une bibliothèque, pas un programme.

Est-il autre chose que je dois ajouter à la classe wrapper projet de bibliothèque de propriétés
ou enregistrer la DLL de classes non gérées, ou les options du compilateur?
Dois-je aussi besoin d'un .fichier lib pour aller avec la DLL? (pas de fichier lib apparaît dans les projets répertoire cible)

Dois-je continuer à utiliser __declspec(dllexport) [il pensait que c'était seulement pour le style C fonctions
pas les membres de la classe.]
comme dans la question: Exporter des Classes non gérées à partir d'une DLL Visual C++?
même si le C++ de la bibliothèque est compilée avec le CLR activé.

(J'ai aussi essayer de compiler une bibliothèque statique, mais je ne peux pas comprendre comment ajouter
l' .fichier lib à la CLR projet de bibliothèque de classes).

Ma classe de test est

namespace Z 
{
class A
{
public:

   int m1(int p1, int p2);
   int m2(int p3, int p4);
};
};

avec la mise en œuvre:

#include "A.h"
namespace Z 
{
int A::m1(int p1, int p2) { return p1+p2; };
int A::m2(int p3, int p4) { return p3 * p4; };
};

Et la classe wrapper est

#pragma once
#include "../A.h"
using namespace System;
namespace test_NET_library {
 public ref class Class1
 {
 private: Z::A *a;
 public: Class1()
  : a(new Z::A)
   {}
 public: inline int m1(int p1, int p2)
  {  return a->m1(p1,p2);
  };
 public: inline int m2(int p3, int p4)
  {return a->m2(p3,p4);
  };
 };
}

Que par la question: C++/CLI Mode Mixte Création d'une DLL
J'ai aussi essayé:

#pragma managed(push, off) 
#include "../A.h"
#pragma managed(pop)

Et aussi ce pousser géré autour de A.cpp.

Mise à jour:
Comme par mcdave de réponse, j'ai enlevé l' /clr ce produit une DLL, maintenant comment puis-je faire de cette DLL disponible pour mon test_NET_library?

J'ai essayé de References/Ajouter une Nouvelle Référence, et sélectionné la nouvelle cette nouvelle DLL; ai le message "impossible d'ajouter la référence de fichier "C:..\unmanaged_lib.dll" parce que c'est ni .NET de l'assemblée ou enregistré contrôle ActiveX.". La DLL a été ajouté au projet de la liste de fichiers, mais le compilateur semble l'ignorer.

J'ai essayé d'Ajouter/item Existant et sélectionné la nouvelle DLL.
mais .Les fichiers DLL sont pas un choix de type de fichier.

Essayez de supprimer /clr de la classe A de la DLL (sens de le rendre "normal" dll win32) et si cela ne fonctionne pas de mise à jour de votre question.
Je l'ai fait, mais ensuite je ne sais pas comment faire test_NET_libary de "conscience" ou "lien" ce unmanaged_lib.DLL contenant Une (voir mon montage ci-dessus). C'est le même problème j'ai essayer d'utiliser unmanaged_lib comme statiquement .lib.

OriginalL'auteur Roger Nelson | 2010-10-23