C ++ / CLI involucro per il codice nativo C / C ++, in grado di caricare in Unity3D
Domanda
ho cercato e guardando tutta la rete su come caricare un assembly in Unity3D, e sto avendo un vero e proprio momento difficile. Mi dispiace se questo post sarà lunga, ma sarò mettendo tutto quello che ho imparato e quanto ho ottenuto dato che questa è la mia prima volta nel lavoro .net e dll.
ho una dll nativa, ha un sacco di extern "C" in modo da poter caricare tutto in fase di esecuzione. Questo funziona in unità se uso l'attributo [DllImport] e così via. Tuttavia, è ingombrante, e non realmente codice riutilizzabile. Sarebbe diventato ancora più ingombrante più tardi, quando dovrò astratto il mio sistema tra più di 1 libreria nativa.
Così ho pensato che avrei fatto un C +++ / CLI involucro e poi caricarlo in Unity3d come qualsiasi altro dll e basta collegare lo spazio dei nomi: "usando MyWrapper;"
Ho creato la più semplice C ++ / CLI lib mi veniva in mente. tutta la mia lib non è avere una classe (Class1) e ha una funzione int getNum () {return 5;}. Sto usando VC ++ 2010 Express, e sto costruendo con V90, e modificato il file vcxproj a bersaglio 2.0. So che l'unità supporta solo 2.0. Sto costruendo in / CLR in modo da essere in grado di avere codice nativo e .net.
Si blocca completamente Unity3D. Questo è il mio registro errori a GameManager.Awake () [0x0001d] in Gestione \ GameManager.cs: 116 a GameManager.Awake () [0x00000] in Gestione \ GameManager.cs: 107 a (involucro runtime-invoke) GUIRadioButton.runtime_invoke_void (oggetto, IntPtr, IntPtr, IntPtr) <0xffffffff> Ricezione di eccezione non gestita NULL
se io costruisco in CLR /: sicuro, invece funziona benissimo. / CLR:. Puro fa, inoltre, non opera
Così ho deciso di fare un progetto riga di comando c # esterno alla prova tutto. Io carico la mia lib, e compilare in 2.0 e / CLR (modalità mista) funziona senza un problema.
Sto utilizzando Unity 2.6 Pro.
E 'forse quello che sto cercando di fare è impossibile, non lo so .. voglio dire ho capito che era quello che .NET era tutto. Voglio solo avere un sistema che può essere riutilizzato in altri progetti (C ++).
Grazie per qualsiasi comprensione.
Ecco la mia prova c ++ / CLI progetto.
#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;}
};
}
Quando creo un progetto C # linea di comando come questo. funziona.
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());
}
}
}
L'esecuzione di questa linea nel Unity3d si blocca tutto il redattore. (Sì ho messo nel l'istruzione using)
Class1 c = new Class1();
Soluzione
AFAIK, gruppi C ++ / CLI non funzionano con Unity, come Unity si basa su Mono che non supporta gruppi misti. L'unica soluzione è quella di funzioni di chiamata da una DLL con p classica / Invoke