托管代碼是一microsoft的中間語言(IL)渗柿,它不直接運(yùn)行在機(jī)器上而是運(yùn)行在.net的CLR中。IL被封裝在一個叫程序集(assembly)的文件中矾芙,一般輸出形式為.dll或.exe文件舍沙,程序集中包含了描述你所創(chuàng)建的類,方法和屬性(例如安全需求)的所有元數(shù)據(jù)剔宪。
當(dāng)程序集中某些方法被調(diào)用的時候拂铡,運(yùn)行庫把具體的方法編譯成適合本地計(jì)算機(jī)運(yùn)行的機(jī)械碼。(這就是即時編譯) 隨著程序集的運(yùn)行葱绒,運(yùn)行庫會持續(xù)地提供各種服務(wù)感帅,例如自動垃圾回收、運(yùn)行庫類型檢查和安全支持等地淀。這些服務(wù)使得能編譯成IL的源代碼具有跨平臺的特性失球。我們常用的C#只能編譯成托管代碼,而C++可以編譯成托管代碼和非托管代碼帮毁。非托管代碼就是直接編譯成目標(biāo)計(jì)算機(jī)的機(jī)器碼实苞。
Unity3D中調(diào)用托管代碼并不需要引入特性,我們演示一遍Unity3D中如何調(diào)用托管代碼:
1烈疚、創(chuàng)建類庫項(xiàng)目黔牵,注意選擇.net3.5版本,高版本Unity3d不支持
2、編寫任意方法并生成Dll
namespace ManageDll
{
public class Class1
{
public string GetMessage()
{
return "成功調(diào)用非托管代碼的方法";
}
public int Add(int a, int b)
{
return a + b;
}
}
3爷肝、找到項(xiàng)目源文件\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上,觀察輸出金赦,調(diào)用成功
調(diào)用非托管Dll需要使用Dlllmport特性,有興趣的可以自行搜索危号。