2011-03-15 44 views
3

我一直在關注如何在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(); 
+0

Post code,不要描述你做了什麼。發佈完整的C++/CLI類和使用該類的C#代碼片段。 – 2011-03-15 15:20:41

+0

添加代碼。希望它有幫助。 – 2011-03-15 15:40:09

回答

4

據我所知,C++/CLI組件不團結工作,爲統一是靠單不支持混合程序。唯一的解決方法是從經典的p /調用dll調用函數

+0

看起來你是對的。這將解釋它。我想我真的沒有選擇,只能使用P/Invoke。這裏是參考。 [Mono-CPP](http://www.mono-project。com/CPlusPlus)[Mono-FAQ](http://www.mono-project.com/FAQ:_Technical#Compatibility) – 2011-03-15 16:09:12