Я искал и искал по всей сети, как загрузить сборку в 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 приводит к сбою всего редактора.
Есть ли предложения по другим методам, которые были бы полезны?
Спасибо