我一直在關注如何在Unity3D中加載程序集,並一直在尋找和尋找網絡,並且我遇到了困難。我很抱歉,如果這篇文章會很長,但我會把我學到的所有東西和我已經得到的東西放在一起,因爲這是我第一次使用.net和dll。本機C/C++代碼的C++/CLI包裝,無法在Unity3D中加載
我有一個原生的dll,它有一大堆extern「C」,所以我可以在運行時加載所有東西。如果我使用[DLLImport]屬性等,這將工作在統一。但是,這很麻煩,並且不是真正可重用的代碼。如果我不得不在多個本地庫之間抽象我的系統,那麼以後會變得更加麻煩。
所以我想我會做一個C+++/CLI包裝,然後在Unity3d中加載它像任何其他的DLL,只是鏈接的命名空間:「使用MyWrapper;」
我創建了我能想到的最簡單的C++/CLI庫。我所有的lib都有一個類(Class1),它有一個函數int getnum(){return 5;}。我正在使用VC++ 2010 express,並且正在使用V90進行構建,並將vcxproj文件修改爲目標2.0。我知道團結只支持2.0。我建立在/ clr爲了能夠有本地和.net代碼。
它完全崩潰unity3d。 (包裝器運行時調用)中的GameManager.Awake()[0x00000]:107 這是我在GameManager.Awake中的錯誤日誌 (管理器\ GameManager.cs中的[0x0001d]:116在GameManager.Awake中的 GUIRadioButton.runtime_invoke_void(對象,IntPtr的,IntPtr的,IntPtr的)<爲0xffffffff> 接收未處理的異常NULL
如果我建立它在/ CLR:安全,而不是它工作正常。/clr:純也不起作用。
所以我決定做一個外部的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();
Post code,不要描述你做了什麼。發佈完整的C++/CLI類和使用該類的C#代碼片段。 – 2011-03-15 15:20:41
添加代碼。希望它有幫助。 – 2011-03-15 15:40:09