托管代码是一microsoft的中间语言(IL),它不直接运行在机器上而是运行在.net的CLR中。IL被封装在一个叫程序集(assembly)的文件中,一般输出形式为.dll或.exe文件,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。
当程序集中某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码。(这就是即时编译) 随着程序集的运行,运行库会持续地提供各种服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务使得能编译成IL的源代码具有跨平台的特性。我们常用的C#只能编译成托管代码,而C++可以编译成托管代码和非托管代码。非托管代码就是直接编译成目标计算机的机器码。
Unity3D中调用托管代码并不需要引入特性,我们演示一遍Unity3D中如何调用托管代码:
1、创建类库项目,注意选择.net3.5版本,高版本Unity3d不支持

2、编写任意方法并生成Dll
namespace ManageDll
{
public class Class1
{
public string GetMessage()
{
return "成功调用非托管代码的方法";
}
public int Add(int a, int b)
{
return a + b;
}
}

3、找到项目源文件\bin\Debug下的dll文件将其拷贝到Unity3d中Plugins中

4、编写个测试脚本,注意引用DLL的命名空间
using UnityEngine;
using System.Collections;
using ManageDll;
public class UsingDll : MonoBehaviour
{
void Start()
{
Class1 test = new Class1();
string a = test.GetMessage();
print(a);
int b = test.Add(2, 3);
print(b);
}
}
5、将测试脚本挂载到场景中任意GameObject上,观察输出,调用成功

调用非托管Dll需要使用Dlllmport特性,有兴趣的可以自行搜索。
网友评论