Оболочка C ++ / CLI для собственного кода C / C ++, не может загрузить в Unity3D

Я искал и искал по всей сети, как загрузить сборку в Unity3D, и я ' м очень тяжело. Прошу прощения, если этот пост будет длинным, но я выложу все, что я узнал и как далеко я продвинулся, так как я впервые работаю с .net и dll.

У меня есть собственная dll , у него есть целая куча extern "C", поэтому я могу загружать все во время выполнения. Это работает в единстве, если я использую атрибут [DLLImport] и тому подобное. Однако это громоздкий код, который нельзя использовать повторно. Позже это станет еще более громоздким, когда мне придется абстрагировать свою систему между более чем одной нативной библиотекой.

Итак, я решил, что создам оболочку C +++ / CLI, а затем загружу ее в Unity3d, как любую другую dll, и просто свяжу пространство имен: "using MyWrapper;"

Я создал простейшую библиотеку C ++ / CLI, какую только мог придумать. вся моя библиотека имеет класс (Class1) и функцию int getnum () {return 5;}. Я использую VC ++ 2010 express, строю с V90 и изменяю файл vcxproj на версию 2.0. Я знаю, что Unity поддерживает только 2.0. Я создаю / clr, чтобы иметь собственный код и код .net.

Это приводит к полному сбою unity3d.

Я создал простейшую библиотеку C ++ / CLI, какую только мог придумать. вся моя библиотека имеет класс (Class1) и функцию int getnum () {return 5;}. Я использую VC ++ 2010 Express, строю с V90 и изменяю файл vcxproj на версию 2.0. Я знаю, что Unity поддерживает только 2.0. Я создаю / clr, чтобы иметь собственный код и код .net.

Это приводит к полному сбою unity3d.

Я создал простейшую библиотеку C ++ / CLI, какую только мог придумать. вся моя библиотека имеет класс (Class1) и функцию int getnum () {return 5;}. Я использую VC ++ 2010 Express, строю с V90 и изменяю файл vcxproj на версию 2.0. Я знаю, что Unity поддерживает только 2.0. Я создаю / clr, чтобы иметь собственный код и код .net.

Это приводит к полному сбою unity3d. Это мой журнал ошибок в GameManager.Awake () [0x0001d] в Manager \ GameManager.cs: 116 в GameManager.Awake () [0x00000] в Manager \ GameManager.cs: 107 at (вызов времени выполнения оболочки) GUIRadioButton.runtime_invoke_void (object, intptr, intptr, intptr) <0xffffffff> Получение необработанного исключения NULL

, если я встраиваю его в / clr: safe, вместо этого оно работает нормально. / clr: pure тоже не работает.

Поэтому я решил создать проект внешней командной строки C #, чтобы все протестировать. Я загружаю свою библиотеку и компилирую в 2.0 и / clr (смешанный режим) работает без проблем.

Я использую Unity 2.6 Pro.

Возможно, то, что я пытаюсь сделать, невозможно, я не знаю ... Я имею в виду, что я полагал, что это то, чем занимается .NET. Я просто хочу иметь систему, которую можно будет повторно использовать в других проектах (C ++).

Спасибо за любую информацию.

Вот мой тестовый проект 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;}
    };
}

Когда я создаю проект командной строки C #, подобный этому . это работает.

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

Выполнение этой строки в Unity3d приводит к сбою всего редактора.

Есть ли предложения по другим методам, которые были бы полезны?

Спасибо

7
задан steve 15 March 2011 в 14:39
поделиться