Question

J'ai cherché et en regardant sur le net sur la façon de charger un assemblage dans Unity3D, et je vais avoir un temps réel dur. Je suis désolé si ce poste sera long, mais je vais mettre tout ce que j'ai appris et jusqu'où je suis arrivé car c'est mon premier travail de temps en .net et dll.

J'ai un dll natif, il a tout un tas de extern « C » donc je peux charger tout à l'exécution. Cela fonctionne dans l'unité si j'utilise l'attribut [DLLImport] et tel. Cependant, il est lourd, et pas vraiment du code réutilisable. Il serait encore plus lourd plus tard, quand je vais devoir faire abstraction de mon système entre plus de 1 bibliothèque native.

Alors je me suis dit que je ferais un C +++ / CLI wrapper puis le charger dans Unity3d comme tout autre dll et juste un lien l'espace de noms: « en utilisant MyWrapper; »

Je créé le plus simple C ++ / CLI lib je pouvais penser. tout mon lib n'est d'avoir une classe (Class1) et il a une fonction int getnum () {return 5;}. J'utilise express VC ++ 2010, et je construis avec V90, et modifié le fichier vcxproj pour cibler 2.0. Je sais que l'unité ne supporte que 2.0. Je construis dans / clr afin d'être en mesure d'avoir le code natif et .net.

Il se plante complètement Unity3D. Ceci est mon journal d'erreur à GameManager.Awake () [0x0001d] dans le Gestionnaire \ GameManager.cs: 116 à GameManager.Awake () [0x00000] dans le Gestionnaire \ GameManager.cs: 107 au (wrapper runtime-invocation) GUIRadioButton.runtime_invoke_void (objet, IntPtr, IntPtr, IntPtr) <0xffffffff> Réception exception non gérée NULL

si je construis dans / clr: au lieu sûr il fonctionne très bien. / Clr:. Pur ne fonctionne pas non plus

Alors j'ai décidé de faire un projet de ligne de commande externe c # pour tout test. Je charge mon lib, et compilez 2.0 et / clr (mode mixte) fonctionne sans problème.

Je Unity Pro 2.6.

Il est peut-être ce que je cherche à faire est impossible, je ne sais pas .. Je veux dire que je me suis dit que c'était .NET était tout au sujet. Je veux juste avoir un système qui peut être réutilisé dans d'autres projets (C ++).

Merci pour toute perspicacité.

Voici mon test c ++ / projet 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;}
    };
}

Quand je crée un projet de ligne de commande C # comme celui-ci. cela fonctionne.

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'exécution de cette ligne dans l'éditeur Unity3d bloque tout. (Oui, j'ai mis dans l'instruction à l'aide)

Class1 c = new Class1();
Était-ce utile?

La solution

AFAIK, ensembles C ++ / CLI ne fonctionnent pas avec l'unité, comme l'unité se fonde sur Mono qui ne supporte pas les assemblées mixtes. La seule solution consiste à des fonctions d'appel d'un dll avec p / Invoke classique

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top