C ++/CLI обертка для нативного кода C/C ++, невозможно загрузить в Unity3d
Вопрос
Я смотрел и смотрю по всей сети о том, как загрузить сборку в 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