La vinculación no administrado C ++ DLL con manejado C ++ DLL de biblioteca de clases

StackOverflow https://stackoverflow.com/questions/4002269

  •  25-09-2019
  •  | 
  •  

Pregunta

Al igual que en la pregunta Creación sencilla c ++. Envoltorio red. Paso a paso

Estoy Tring para utilizar clases de C ++ en .NET sino estoy teniendo problemas de construcción en Visual Studio (2008).

Tengo una clase A no administrado (C ++ compilado con / clr). Creé una clase ++ / clr C 'Class1' que envuelve A y con coincidente delegados método para métodos de A.

Si incluyo archivo fuente de la unidad de la clase A en la biblioteca de clases proyecto de Clase 1 (administrado) no tengo problemas enlaces y todo funciona bien, Pero tengo muchas clases C ++ no administrado como A y Tring para ponerlos en una DLL y un enlace que DLL a la biblioteca administrada (de contenedores de clase). [En realidad no veo la necesidad de vincular de estos DLL en este punto, pero el aparece compilador para ser lo requieran, dando los mismos errores que se muestran a continuación].

He creado ++ biblioteca VisualC / CLR / Clase y añadido a mi clase de C ++ (A enumeran a continuación) y de construcción. [He utilizado la configuración predeterminada, pero en la configuración del proyecto enlazador He intentado tanto Registro de salida con sí y no.] No hubo errores y el archivo DLL se creó.

He creado ++ biblioteca VisualC / CLR / Clase y creó la clase de contenedor 'Clase 1' He utilizado todos los valores predeterminados. En virtud de las propiedades del proyecto chasqué 'Referencias' 'Añadir nueva referencia" y selecciona el DLL creada en el primer paso.

consigo errores de enlace:

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

Los mismos errores que si quito a.cpp en el proyecto de biblioteca de clases envoltorio (la opción de que las obras). No entiendo por qué la acumulación está tratando de resolver las cosas externas en el primer lugar porque se trata de una biblioteca, no un programa.

¿Hay algo más que tenga que añadir a las propiedades del proyecto de biblioteca clase contenedora o registrar la DLL de clases no administrados, o las opciones del compilador? ¿También necesito un archivo .lib para ir con la DLL? (No aparece archivos lib en el directorio de proyectos de destino)

¿Todavía tengo que utilizar __declspec (dllexport) [pensaba que era sólo para funciones de estilo C no miembros de la clase.] al igual que en la pregunta: ¿ exportación no administrados desde un Visual C ++ DLL a pesar de que la biblioteca de C ++ no administrado se compila con CLR habilitado.

(lo hice también tratar de compilar como una biblioteca estática, pero no puedo averiguar cómo añadir el archivo .lib al proyecto de biblioteca de clases CLR).

Mi clase de prueba es

namespace Z 
{
class A
{
public:

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

por la aplicación:

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

Y la clase contenedora es

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

De acuerdo con la pregunta: C ++ / CLI de modo mixto DLL Creación También he intentado:

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

Y también esta empujando logró alrededor a.cpp.

Actualización: De acuerdo con la respuesta de mcdave Quité el / CLR Esto produjo una DLL, ahora cómo hago esta DLL disponible para mi test_NET_library?

Me trató Referencias / Agregar nueva referencia, y selecciona el nuevo esta nueva DLL; y recibió el mensaje "No se pudo añadir una referencia a archivo 'C: .. \ unmanaged_lib.dll'. porque no es ni .NET montaje o control ActiveX registrado". La DLL se añadió a la lista de archivos del proyecto, pero el aparece compilador no hacer caso de él.

He intentado Añadir / El actual número seleccionado y el nuevo archivo DLL. pero los archivos DLL no son un tipo de archivo seleccionable.

¿Fue útil?

Solución

Con los pocos indicios de su actualización Voy a tratar dos conjeturas ...

  1. Cuando unmanaged_lib es un lib enlazado estáticamente, se ha marcado el proyecto unmanaged_lib ser una dependencia de test_NET_library? (En la ventana Explorador de proyectos, haga clic en test_NET_library, seleccione "Dependencias del proyecto ..." y seleccione unmanaged_lib.)
  2. Cuando unmanaged_lib es una DLL, es necesario exportar la clase de la DLL siguiendo esta respuesta y también lo de test_NET_library dependerá del proyecto unmanaged_lib.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top