c# c++ unity3d dll

c# - Construir el complemento C++ para Unity



unity3d dll (1)

Intentando crear mi primer complemento. El código cpp es:

encabezamiento:

#pragma once #ifndef __MY_DLL_H #define __MY_DLL_H extern "C" int add_1(int number); #endif

fuente:

//FirstDLL.cpp #include "FirstDLL.h" extern "C" int add_1(int number) { return number + 1; }

Luego compilo y pongo la DLL en la carpeta Assets/Plugins , el archivo dll es FirstDLL.dll . Desde el lado de la unidad, tengo un script simple de C # para un componente:

using UnityEngine; public class MyBehaviour : MonoBehaviour { // Use this for initialization [Header("Nuts!")] public int my_curr_val; void Start () { } // Update is called once per frame void Update () { print(add_1(my_curr_val)); } [DllImport("FirstDLL")] public static extern int add_1(int number); }

Pero cuando trato de ejecutar el script me sale el siguiente error:

Complementos: Error al cargar ''Activos / Complementos / FirstDLL.dll'' con error ''Esta operación solo es válida en el contexto de un contenedor de aplicaciones. ''. Complementos: Error al cargar ''Activos / Complementos / FirstDLL.dll'' con error ''Esta operación solo es válida en el contexto de un contenedor de aplicaciones. ''. DllNotFoundException: FirstDLL MyBehaviour.Update () (en Assets / MyBehaviour.cs: 17)

La documentación parece ser bastante pobre, ¿alguna sugerencia? Hay una respuesta , pero no estoy seguro de lo que estoy haciendo mal. Intenté crear varias soluciones (plataforma universal de Windows, Windows 8.1, etc.) todavía no funciona.


Está intentando cargar el complemento UWP en un entorno que no es UWP y esto se debe a la forma en que construye su dll.

Esta publicación describe cómo crear, compilar y construir el complemento C ++ en Unity.

Versión de software utilizada para esto (también debería funcionar para otras versiones anteriores. Esta información se menciona en caso de que haya una actualización y una IU diferente en el futuro):

  • Microsoft Visual Studio 2015

  • Unidad 2017.2.0f3

1. Vaya a Archivo ---> Nuevo ---> Proyecto ...

2 . Vaya a Instalado -> Plantillas ---> Visual C ++ luego Aplicación de consola Win32 . Escriba el nombre del proyecto y luego haga clic en Aceptar.

3. Haga clic en Siguiente en lugar de Finalizar :

4. Seleccione DLL y deseleccione el encabezado precompilado y luego haga clic en finalizar:

5. Ahora puede crear sus archivos fuente (.cpp) y de encabezado (.h).

A. Crear un archivo fuente:

Esto debe colocarse en la carpeta de archivos de origen . Haga clic derecho en los archivos de origen ---> Agregar ---> Nuevo elemento ...

B. Seleccione Archivo C ++ (.cpp), escriba el nombre del archivo "FirstDLL.cpp" y luego haga clic en Agregar.

Ejemplo de fuente de prueba C ++:

#include "FirstDLL.h" int add(int num1, int num2) { return num1 + num2; } int multiply(int num1, int num2) { return num1 * num2; } int substract(int num1, int num2) { return num1 - num2; } int divide(int num1, int num2) { return num1 / num2; }

A. Crear un archivo de encabezado:

Esto debe colocarse en la carpeta Archivos de encabezado . Haga clic derecho en Archivos de encabezado ---> Agregar ---> Nuevo elemento ...

B. Seleccione Archivo de encabezado (.h) , escriba el nombre del archivo "FirstDLL.h" y luego haga clic en Agregar.

Ejemplo de encabezado correspondiente:

#ifndef FIRSTDLL_NATIVE_LIB_H #define FIRSTDLL_NATIVE_LIB_H #define DLLExport __declspec(dllexport) extern "C" { DLLExport int add(int num1, int num2); DLLExport int multiply(int num1, int num2); DLLExport int substract(int num1, int num2); DLLExport int divide(int num1, int num2); } #endif

Eso es. Ahora puede escribir su código de complementos de C ++ allí.

6. Asegúrese de configurar la versión de lanzamiento y la plataforma en 64 bits

Si usa 32 bits, configure la plataforma en x86.

7) Complemento de construcción:

Vaya a Build ---> Build Solution

8) Importando a la Unidad:

PC, Mac y Linux independientes :

Coloque el archivo dll de 64 bits en la carpeta Assets/Plugins .

Si solo desea admitir 32 bits, coloque el complemento en Assets/Plugins/x86 .

Si desea admitir universal (plataforma de 32 bits y de 64 bits), cree el dll como tal y Assets/Plugins/x86_64 carpeta Assets/Plugins/x86_64 .

Android :

Se puede construir desde Android Studio .

Para construir desde Visual Studio:

A .Vaya a Archivo ---> Nuevo ---> Proyecto ...

B. Vaya a Instalado -> Plantillas ---> Visual C ++ y luego Plataforma cruzada . Haga clic en Instalar soporte de Android para C ++ (Actualización x) . luego siga las instrucciones para instalarlo.

C. Vaya a Instalado -> Plantillas ---> Visual C ++ ---> Multiplataforma . entonces Android . Seleccione Biblioteca de fragmentos dinámicos (Android) , escriba el nombre del proyecto y haga clic en Aceptar. Ahora, puede volver al paso 5 para continuar codificando en C ++.

Coloque el archivo de complemento de Android (no dll) en la carpeta Assets/Plugins/Android . La extensión del complemento C ++ compatible .so .

Nota : Si el nombre del complemento de Android es libFirstDLL-lib.so , elimine el prefijo lib y el .so cuando haga referencia a él desde C #. En este caso, sería [DllImport("FirstDLL-lib")] diferencia de lo que es habría estado en el # 9.

Si tiene los armeabi-v7a y x86 Android armeabi-v7a Assets/Plugins/Android/libs/armeabi-v7a y Assets/Plugins/Android/libs/x86 respectivamente.

iOS

Se puede construir desde Xcode o incluir el archivo fuente en Unity. También puedes crearlo con Visual Studio. Simplemente siga el paso de Android anterior, pero use Instalar soporte de iOS para C ++ (Actualización x) esta vez en lugar de Instalar soporte de Android para C ++ (Actualización x) . Tenga en cuenta que necesita una computadora Mac para compilar para iOS o usar una máquina virtual. Una vez que haga esto, siga this instrucciones de Microsoft para finalizar la configuración para que Visual Studio pueda comunicarse y construir el proyecto en su Mac OS.

Coloque el archivo de complemento de iOS (no dll) en la carpeta Assets/Plugins/iOS . Las extensiones de complementos compatibles son .a , .m , .mm , .c , .cpp .

Debe usar [DllImport ("__Internal")] lugar de [DllImport("PluginName")] o [DllImport("FirstDLL")] como se ve a continuación en # 9 .

9) Llamando a la función C ++ desde Unity / C # :

[DllImport("FirstDLL")] public static extern int add(int num1, int num2); [DllImport("FirstDLL")] public static extern int multiply(int num1, int num2); [DllImport("FirstDLL")] public static extern int substract(int num1, int num2); [DllImport("FirstDLL")] public static extern int divide(int num1, int num2); void Start() { Debug.Log("Add: " + add(10, 2)); Debug.Log("Multiply: " + multiply(10, 2)); Debug.Log("Substract: " + substract(10, 2)); Debug.Log("Divide: " + divide(10, 2)); }

Salida :

10) SOLUCIÓN DE PROBLEMAS DE ERRORES DE PLUGIN:

1. Obteniendo el error:

DllNotFoundException:

Solución 1 :

El nombre de la DLL especificada en DllImport no coincide con el nombre de Dll. Asegúrese de que coincidan cambiándoles el nombre y luego reinicie Unity.

Solución 2 :

La DLL se coloca en la carpeta incorrecta. La carpeta debe llamarse Assets/Plugins . La ortografía también distingue entre mayúsculas y minúsculas.

2. Obteniendo el error:

EntryPointNotFoundException:

Solución 1 :

El nombre de la función declarado DllImport no existe o no coincide con el declarado en el lado de C ++. Asegúrese de que la ortografía sea la misma en ambos lados. La ortografía también distingue entre mayúsculas y minúsculas.

Solución 2 :

Las funciones de DLL de C ++ no se incluyen en el complemento de C ++. En Windows, dllexport se usa para hacer que estas funciones se exporten a sí mismas en la DLL. Esto no es necesario en otras plataformas o sistemas operativos. Esto generalmente se hace en el archivo de encabezado solo para mantener limpio el archivo de origen. Vea el ejemplo en el archivo de encabezado arriba o la captura de pantalla a continuación.

Solución 3 :

Su compilador está renombrando las funciones de C ++. Puede evitar esto encerrándolos con la palabra clave extern . Nuevamente, vea el ejemplo en el archivo de encabezado arriba o la captura de pantalla a continuación:

2. Sin error pero resultado incorrecto o por cable:

Solución 1 :

El parámetro no coincide. Asegúrese de que el parámetro de la función en el lado de C ++ y C # coincida y tenga la misma cantidad de parámetro. También el tipo de datos debe coincidir. Si no lo hacen, espere un comportamiento indefinido.