Pregunta

He estado buscando y mirando en toda la red sobre cómo cargar un ensamblaje en Unity3D, y estoy pasando un momento realmente difícil. Lo siento si esta publicación será larga, pero pondré todo lo que he aprendido y qué tan lejos he llegado, ya que esta es la primera vez que trabajo en .NET y DLLS.

Tengo una DLL nativa, tiene un montón de "C" extern para poder cargar todo en tiempo de ejecución. Esto funciona en Unity si uso el atributo [DllImport] y tal. Sin embargo, es un código engorroso y no realmente reutilizable. Se volvería aún más engorroso más tarde cuando tendré que abstraer mi sistema entre más de 1 biblioteca nativa.

Así que pensé que haría un envoltorio C +++/CLI y luego lo cargaría en Unity3D como cualquier otro DLL y simplemente vincularía el espacio de nombres: "Usando MyWrapper";

Creé el C ++/CLI más simple que se me ocurrió. Todo lo que mi libra es tener una clase (clase1) y tiene una función int getnum () {return 5;}. Estoy usando VC ++ 2010 Express, y estoy construyendo con V90, y modifiqué el archivo VCXProj a Target 2.0. Sé que Unity solo admite 2.0. Estoy construyendo IN /CLR para poder tener código nativo y .NET.

Se bloquea por completo a Unity3D. Este es mi registro de errores en gamemanager.awake () [0x0001d] en gerente gamemanager.cs: 116 en gamemanager.awake () [0x00000] en gerente gamemanager.cs: 107 en (Wrapper Runtime-Invoke) guiradiobutton.runtime_invoke_void ( Object, intptr, intptr, intptr) <0xffffffff> Recibir excepción nulo no controlada

Si lo construyo en /clr: seguro, en su lugar funciona bien. /CLR: Pure tampoco funciona.

Así que decidí hacer un proyecto de línea de comando C# externo para probar todo. Cargo mi lib y compilo en 2.0 y /CLR (modo mixto) funciona sin ningún problema.

Estoy usando Unity 2.6 Pro.

Es posiblemente lo que estoy buscando hacer es imposible, no lo sé ... Quiero decir que pensé que de eso se trataba .NET. Solo quiero tener un sistema que se pueda reutilizar 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 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());
        }
    }
}

La ejecución de esta línea en Unity3D bloquea todo el editor. (Sí, puse la declaración de uso)

Class1 c = new Class1();
¿Fue útil?

Solución

Los conjuntos AFAIK, C ++/CLI no funcionan con Unity, ya que la Unidad depende de Mono que no admite ensamblajes mixtos. La única solución es llamar a funciones de un DLL con clásico P/Invoke

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top