Frage

Ich habe überall im Netz gesucht und darüber nachgedacht, wie man eine Baugruppe in Unity3D lädt, und es fällt mir eine wirklich schwere Zeit. Es tut mir leid, wenn dieser Beitrag lang sein wird, aber ich werde alles, was ich gelernt habe, und wie weit ich gekommen bin, da dies das erste Mal in .NET und DLLS ist.

Ich habe eine native DLL, es hat eine ganze Reihe von externen "C", damit ich alles zur Laufzeit laden kann. Dies funktioniert in Einheit, wenn ich das [dllimport] Attribut und dergleichen verwende. Es ist jedoch umständlich und nicht wirklich wiederverwendbar. Es würde später noch umständlicher werden, wenn ich mein System zwischen mehr als einer nativen Bibliothek abstrahieren muss.

Also dachte ich mir, ich würde einen C +++/CLI -Wrapper machen und es dann in Unity3D wie jede andere DLL laden und einfach den Namespace verlinken: "Mit MyWrapper;"

Ich habe das einfachste C ++/Cli lib erstellt, an das ich denken konnte. Alles, was meine LIB tut, ist eine Klasse (Klasse1) und es hat eine Funktion intnum () {return 5;}. Ich verwende VC ++ 2010 Express und baue mit V90 und modifizierte die VCXProj -Datei an Target 2.0. Ich weiß, dass die Einheit nur 2.0 unterstützt. Ich baue in /CLR auf, um nativen und .NET -Code zu haben.

Es stürzt Unity3d vollständig ab. This is my Error log at GameManager.Awake () [0x0001d] in ManagerGameManager.cs:116 at GameManager.Awake () [0x00000] in ManagerGameManager.cs:107 at (wrapper runtime-invoke) GUIRadioButton.runtime_invoke_void ( Objekt, intptr, intptr, intptr) <0xffffffff> Empfangen Sie ungehandelte NULL -Ausnahme

Wenn ich es in /clr baue: Safe stattdessen funktioniert es gut. /CLR: Pure funktioniert auch nicht.

Also habe ich mich entschlossen, ein externes C# -Schelllinie -Projekt durchzuführen, um alles zu testen. Ich lade meine Bibliothek und kompiliert in 2.0 und /CLR (gemischter Modus) ohne Probleme.

Ich verwende Unity 2.6 Pro.

Es ist möglicherweise das, was ich tun möchte, ist unmöglich, ich weiß es nicht. Ich meine, ich dachte, das war es, worum es bei .net ging. Ich möchte nur ein System haben, das in anderen Projekten wiederverwendet werden kann (C ++).

Danke für irgendeine Einsicht.

Hier ist mein Test C ++/CLI -Projekt.

#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;}
    };
}

Wenn ich ein solches C# -Schellzeilenprojekt erstelle. Es klappt.

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());
        }
    }
}

Durch die Ausführung dieser Zeile in Unity3d stürzt der gesamte Editor ab. (Ja, ich habe die verwendete Anweisung eingelegt)

Class1 c = new Class1();
War es hilfreich?

Lösung

AFAIK, C ++/CLI -Baugruppen arbeiten nicht mit Einheit, da sich die Einheit auf Mono stützt, die keine gemischten Versammlungen unterstützen. Die einzige Problemumgehung besteht darin, Funktionen von einer DLL mit klassischem P/Invoke anzurufen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top