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();
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top