Esta parte de la guía te mostrará cómo puedes invocar código C++ no administrado y construir un proyecto a partir de él. Necesitarás tener el paquete CLI instalado para C++ en Visual Studio y, por favor, ten en cuenta que este ejemplo sólo se probó en Visual Studio 2017.
Necesitamos crear un nuevo proyecto llamado Core ; este debe ser un proyecto vacío Visual C++ . Una vez generado el proyecto, hay que hacer clic con el botón derecho del ratón en el proyecto para ir a las propiedades . En la pestaña General, cambiar el Tipo de configuración por Librería estática (.lib) . Luego, bajo el C/C++ – Precompiled Headers , establezca el Precompiled Header a Not Using Precompiled Headers .
Ahora, haz clic con el botón derecho del ratón en el Núcleo en el explorador de soluciones y añade un nuevo archivo de cabecera llamado Trabajador.h . Esto es, básicamente, un trabajador con un salario.
12345678910111213141516#pragma oncenamespace Core{classWorker{public:constchar* m_Name;private:float m_Salary;public:Worker(constchar* name,float salary);voidraiseSalary(float amount);inlinefloatGetSalary()const{return m_Salary;};};}
cpp
Necesitamos otro archivo de cabecera llamado Core.h . Esto es para una mayor extensibilidad y puedes saltarte la creación de este archivo sin repercusiones. Pero, si lo creas, asegúrate de incluir las siguientes dos líneas en él.
12#pragma once#include "Worker.h"
cpp
Por último, pero no menos importante, necesitamos un código real para alimentar nuestra aplicación.
123456789101112131415#include "Worker.h "#include<iostreamream{;namespace Core{ Worker::Worker(constchar* name,float salary):m_Name(name),m_Salary(salary){ std::cout << "¡Objeto Worker creado con éxito! "Evitar Trabajador::raiseSalary(float amount){ m_Salario *= cantidad; std::cout << "Aumento de salario del Trabajador"< m_Nombre <<" a "<< m_Salario << std::endl;}}
cpp
Ahora necesitamos un nuevo proyecto. Haga clic con el botón derecho del ratón en nuestro proyecto y añada un nuevo proyecto llamado Wrapper . Esto debería ser una Biblioteca de Clases bajo Visual C++ – CLR .
Primero, definimos nuestro archivo de cabecera Worker.h .
1234567891011121314151617181920212223242526#pragma once#include "ManagedObject.h "#include"../Core/Core. h "usingnamespace System;namespace CLI{public ref classWorker:public ManagedObject<Core::Worker;{public:Worker(String^ name,float salary);voidraiseSalary(float amount); property float Salary {public:floatget(){return m_Salary-{N-GetSalary();}private:voidset(float value){}}};}
cpp
Nuestro ManagedObject.h nos da la flexibilidad de ampliar aún más la aplicación. También proporciona un medio para que el destructor del recolector de basura pueda limpiar después de la ejecución de la aplicación. Esta es una plantilla que se puede encontrar en Internet, ya que es muy común utilizarla.
1234567891011121314151617181920212223242526272829303132333435363738394041#pragma onceusingnamespace System;namespace CLI {template<classT>public ref classManagedObject{protegido: T* m_Instance;public:ManagedObject(T* instance):m_Instance(instance){}virtual~ManagedObject(){if(m_Instance !=nullptr){delete m_Instance;}}!ManagedObject(){if(m_Instance !=nullptr){delete m_Instance;}} T*GetInstance(){retorno m_Instance;}};}sistema de espacio de nombres::Runtime::InteropServices;staticconstchar*string_to_char_array(String^ string){constchar* str =(constchar*)(Marshal::StringToHGlobalAnsi(string)).ToPointer();return str;}
cpp
Para vincular la aplicación Core con la Wrapper , necesitamos añadirla como referencia. Necesitamos hacer clic con el botón derecho del ratón en el proyecto Wrapper , luego Add/Refernce , seleccionar el Core , y luego hacer clic en apply.
Lo último que necesitamos es crear una aplicación en C# que invoque el código no administrado.
Necesitamos crear nuestro proyecto HR , que es un proyecto C#, del tipo (.NET Framework).
Este es todo el código que necesitamos tener ahí:
1234567891011121314151617usando el sistema;usando CLI;namespace HR{classProgram{staticvoidMain(string[] args){Trabajador daniel =newWorker("Dániel Szabó",100000); Console.WriteLine($"El trabajador: {daniel. Nombre} el salario antes del aumento es: {daniel.Salary}"); daniel.raiseSalary(1.1); Console.WriteLine($"El trabajador: {daniel.Name} el salario después del aumento es: {daniel.Salary}"); Console.Read();}}}
csharp
Antes de que podamos ejecutar esta aplicación, necesitamos construir el proyecto Wrapper . Esto se hace haciendo clic con el botón derecho del ratón en el proyecto en la solución y luego haciendo clic en Build . Ahora, lo último que necesitamos hacer es establecer HR para que sea el proyecto de inicio por defecto. Esto también se hace en el explorador de soluciones. Sólo hay que hacer clic con el botón derecho del ratón en el proyecto y luego hacer clic en el Set as StartUp Project .
Ahora podemos iniciar nuestra aplicación y, si se siguieron las instrucciones al pie de la letra, deberíamos ver lo siguiente:
1234¡Creado con éxito Objeto del trabajador! El trabajador: El salario de Dániel Szabó antes del aumento es: 100000Salario del trabajador Dániel Szabó a 110000El trabajador: El salario de Dániel Szabó después del aumento es: 110000
bash