Оболочка C ++ / CLI для собственного кода C / C ++, не загружается в Unity3D - PullRequest
6 голосов
/ 15 марта 2011

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

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

Поэтому я решил, что сделаю оболочку C +++ / CLI, а затем загрузлю ее в Unity3d, как и любую другую DLLи просто свяжите пространство имен: «используя MyWrapper;»

Я создал простейшую библиотеку C ++ / CLI, какую только мог себе представить.все, что делает моя библиотека, имеет класс (Class1) и функцию int getnum () {return 5;}.Я использую VC ++ 2010 Express, и я строю с V90, и изменил файл vcxproj для цели 2.0.Я знаю, единство поддерживает только 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 происходит сбой всего редактора.(Да, я вставил оператор использования)

Class1 c = new Class1();

1 Ответ

6 голосов
/ 15 марта 2011

AFAIK, сборки C ++ / CLI не работают с Unity, поскольку Unity использует Mono, который не поддерживает смешанные сборки.Единственный обходной путь - вызов функций из dll с классическим p / invoke

...