He estado buscando y buscando por toda la red sobre cómo cargar un ensamblado en Unity3D, y me está costando mucho. Lo siento si esta publicación será larga, pero estaré poniendo todo lo que he aprendido y hasta dónde he llegado, ya que es la primera vez que trabajo en .net y dlls.
Tengo un dll nativo, tiene un montón de "C" externas para que pueda cargar todo en tiempo de ejecución. Esto funciona en la unidad si uso el atributo [DLLImport] y tal. Sin embargo, es un código engorroso y no realmente reutilizable. Sería aún más engorroso más adelante cuando tenga que abstraer mi sistema entre más de 1 biblioteca nativa.
Así que pensé en hacer un contenedor C+++/CLI y luego cargarlo en Unity3d como cualquier otro dll y simplemente vincular el espacio de nombres: "using MyWrapper;"
Creé la librería C++/CLI más simple que se me ocurrió. todo lo que hace mi lib es tener una clase (Class1) y tiene una función int getnum() {return 5;}. Estoy usando VC ++ 2010 express, y estoy compilando con V90, y modifiqué el archivo vcxproj para apuntar a 2.0. Sé que la unidad solo es compatible con 2.0. Estoy construyendo en /clr para poder tener código nativo y .net.
Se cuelga completamente unity3d. Este es mi registro de errores en GameManager.Awake () [0x0001d] en Manager\GameManager.cs:116 en GameManager.Awake () [0x00000] en Manager\GameManager.cs:107 en (wrapper runtime-invoke) GUIRadioButton.runtime_invoke_void ( object,intptr,intptr,intptr) <0xffffffff> Recibiendo una excepción NULL no controlada
si lo construyo en /clr:safe en su lugar, funciona bien. /clr:pure tampoco funciona.
Así que decidí hacer un proyecto de línea de comandos externo de C# para probar todo. Cargo mi lib y compilo en 2.0 y /clr (modo mixto) funciona sin problemas.
Estoy usando Unity 2.6 Pro.
Es posible que lo que estoy buscando hacer sea imposible, no lo sé... Quiero decir, pensé que de eso se trataba .NET. Solo quiero tener un sistema que pueda reutilizarse en otros proyectos (C++).
Gracias por cualquier idea.
Aquí está mi proyecto de prueba c++/cli.
#pragma once using namespace System; namespace CLRTest { public ref class Class1 { // TODO: Add your methods for this class here. public: Class1(){} int getnum (){return 5;} }; }Cuando creo un proyecto de línea de comandos de C# como este. funciona.
using System; using System.Collections.Generic; using System.Text; using CLRTest; namespace CLRTestLoad { class Program { static void Main(string[] args) { Class1 c = new Class1(); Console.WriteLine ("num is = " + c.getnum()); } } }Ejecutar esta línea en Unity3d bloquea todo el editor. (Sí, puse la declaración de uso)
Class1 c = new Class1();AFAIK, los ensamblajes C++/CLI no funcionan con Unity, ya que Unity depende de Mono que no admite ensamblajes mixtos. La única solución es llamar a funciones desde un dll con el clásico p/invoke