我一直在网上寻找有关如何在 Unity3D 中加载程序集的信息,但我真的很难过。如果这篇文章会很长,我很抱歉,但是我将把我学到的所有东西以及我已经走了多远,因为这是我第一次在 .net 和 dll 中工作。
我有一个本机 dll,它有一大堆 extern "C",所以我可以在运行时加载所有内容。如果我使用 [DLLImport] 属性等,这将统一工作。但是,它很麻烦,而且不是真正可重用的代码。以后当我必须在多个本地库之间抽象我的系统时,它会变得更加麻烦。
所以我想我会做一个 C++/CLI 包装器,然后像任何其他 dll 一样将它加载到 Unity3d 中,然后链接命名空间:“使用 MyWrapper;”
我创建了我能想到的最简单的 C++/CLI 库。我的库所做的只是有一个类(Class1),它有一个函数 int getnum() {return 5;}。我正在使用 VC++ 2010 express,并且正在使用 V90 构建,并将 vcxproj 文件修改为目标 2.0。我知道统一只支持 2.0。我正在 /clr 中构建,以便能够拥有本机和 .net 代码。
它完全使unity3d崩溃。这是我的错误日志在 GameManager.Awake () [0x0001d] in Manager\GameManager.cs:116 at GameManager.Awake () [0x00000] in Manager\GameManager.cs:107 at (wrapper runtime-invoke) 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 中执行这一行会使整个编辑器崩溃。(是的,我确实放入了 using 语句)
Class1 c = new Class1();