Question

Comme dans la question Création fémi ++. Wrapper net. Étape par étape

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

I ont une classe non géré A (C ++ compilé avec / clr). Je créé un C ++ / classe clr « Class1 » qui enveloppe A et d'adaptation délégués de procédé à des méthodes de A.

Si je classe comprennent le fichier source de l'unité de A dans la bibliothèque de classes projet Class1 (géré) Je n'ai pas de problèmes tout liens et fonctionne très bien, Mais j'ai beaucoup de classes C ++ non géré comme A et je suis Tring pour les mettre en une DLL et lien DLL à la bibliothèque gérée (des emballages de classe). [Je ne vois vraiment pas besoin de relier l'ensemble de ces DLL à ce point, mais le compilateur semble exigerons, en donnant les mêmes erreurs indiquées ci-dessous.]

J'ai créé VisualC ++ / CLR / bibliothèque de classe et a ajouté ma classe C ++ (A ci-dessous) et de construire. [J'ai utilisé les paramètres par défaut, mais dans les paramètres de l'éditeur de liens de projet, je l'ai essayé à la fois Inscrivez-vous avec sortie oui et non.] Il n'y avait pas d'erreur et le fichier .DLL a été créé.

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

Je reçois des erreurs de l'éditeur 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 retire A.cpp dans le projet de bibliothèque de classe wrapper (l'option qui fonctionne). Je ne comprends pas pourquoi la construction tente de résoudre externals en premier lieu parce que c'est une bibliothèque, pas un programme.

Y at-il autre chose que je dois ajouter aux propriétés du projet de bibliothèque de classe wrapper ou enregistrer la DLL de classes non gérés, ou des options de compilateur? Ai-je besoin aussi un fichier .lib pour aller avec la DLL? (Pas de fichier lib apparaît dans le répertoire cible des projets)

Dois-je continuer à utiliser __declspec (dllexport) [il pensait que c'était seulement pour les fonctions de style C non membres de la classe.] comme dans la question: exportation non gérés à partir d'un classes Visual C ++ DLL même si la compilation de la bibliothèque C non géré avec CLR activé.

(j'ai essayé aussi la compilation comme une bibliothèque statique, mais je ne peux pas comprendre comment ajouter le fichier .lib au projet de bibliothèque de classes CLR).

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);
  };
 };
}

par la question: C ++ / CLI en mode mixte DLL Création J'ai aussi essayé:

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

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

Mise à jour: Selon la réponse de mcdave J'ai enlevé le / clr produit ce une DLL, maintenant comment puis-je faire de cette DLL à la disposition de mon test_NET_library?

J'ai essayé Références / Ajouter une nouvelle référence, et le nouveau sélectionné cette nouvelle DLL; et a obtenu le message « Impossible d'ajouter référence au fichier « C: .. \ unmanaged_lib.dll » car il est ni assembly .NET ou un contrôle ActiveX enregistré. ». La DLL a été ajouté à la liste des fichiers du projet, mais le compilateur semble ignorer.

J'ai essayé Ajouter / article Existant et sélectionné la nouvelle DLL. mais les fichiers .DLL ne sont pas un type de fichier sélectionné.

Était-ce utile?

La solution

Avec les quelques conseils de votre mise à jour je vais essayer deux suppositions ...

  1. Lorsque unmanaged_lib est un lib lié statiquement, vous avez mis le projet unmanaged_lib être une dépendance de test_NET_library? (Dans la fenêtre Explorateur de projets, cliquez-droit sur test_NET_library, sélectionnez « Dépendances d'un projet ... » et sélectionnez unmanaged_lib.)
  2. Lorsque unmanaged_lib est une DLL, vous devez exporter la classe de la DLL en suivant cette répondre et aussi faire la test_NET_library dépendent du projet unmanaged_lib.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top