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

StackOverflow https://stackoverflow.com/questions/5313351

Вопрос

Я смотрел и смотрю по всей сети о том, как загрузить сборку в Unity3d, и мне очень тяжело. Извините, если этот пост будет долгим, но я положу все, что узнал, и как далеко я получил, так как это я впервые работаю в .NET и DLL.

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

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

Я создал самый простой C ++/CLI LIB, о котором я мог подумать. Все, что мой LIB имеет класс (класс1), и он имеет функцию int getNum () {return 5;}. Я использую VC ++ 2010 Express, и я строю с V90 и изменил файл VCXPROJ на Target 2.0. Я знаю, что Unity поддерживает только 2.0. Я строю в /clr, чтобы иметь возможность иметь нативный и .NET -код.

Это полностью обрушивает Unity3d. Это мой журнал ошибок на gamemanager.awake () [0x0001d] в Manager gamemanager.cs: 116 at gamemanager.awake () [0x00000] в Manager gamemanager.cs: 107 at (rabper runtime-invoke) guiradiobutton.runtime_invoke_void ( Object, Intptr, Intptr, Intptr) <0xffffffff> Получение невозможного нулевого исключения

Если я строю его в /clr: безопасно вместо этого работает нормально. /clr: Pure также не работает.

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

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

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

Спасибо за какое -либо понимание.

Вот мой тест C ++/CLI Project.

#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();
Это было полезно?

Решение

AFAIK, C ++/CLI Собрание не работают с Unity, так как единство полагается на Mono, который не поддерживает смешанные сборки. Единственный обходной путь - это вызовать функции из DLL с классическим P/Invoke

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top