2015-02-06 108 views
2

我試圖在Ubuntu上使用MasterQ32's OpenWorld.Engine。我遵循了「Documentation」的示例場景。除資產導入外,一切運行良好。有趣的是,Windows 7也出現同樣的錯誤:Assimp.NET的庫加載程序找不到kernel32.dll。下面是堆棧跟蹤:在Mono/Linux下編譯Assimp.NET

Unhandled Exception: 
System.DllNotFoundException: kernel32 
    at (wrapper managed-to-native) Assimp.Unmanaged.NativeMethods:LoadLibrary (string) 
    at Assimp.Unmanaged.AssimpLibraryImplementation.LoadLibrary (System.String path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String libPath) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String lib32Path, System.String lib64Path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadIfNotLoaded() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.EnableVerboseLogging (Boolean enable) [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.PrepareImport() [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.ImportFileFromStream (System.IO.Stream stream, PostProcessSteps postProcessFlags, System.String formatHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Model.Load (OpenWorld.Engine.AssetLoadContext context, System.IO.Stream stream, System.String extensionHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Asset+<Load>c__AnonStorey0`1[OpenWorld.Engine.Model].<>m__0() [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Game.DeferRoutines() [0x00000] in <filename unknown>:0 
    at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: kernel32 
    at (wrapper managed-to-native) Assimp.Unmanaged.NativeMethods:LoadLibrary (string) 
    at Assimp.Unmanaged.AssimpLibraryImplementation.LoadLibrary (System.String path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String libPath) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String lib32Path, System.String lib64Path) [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadLibrary() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.LoadIfNotLoaded() [0x00000] in <filename unknown>:0 
    at Assimp.Unmanaged.AssimpLibrary.EnableVerboseLogging (Boolean enable) [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.PrepareImport() [0x00000] in <filename unknown>:0 
    at Assimp.AssimpImporter.ImportFileFromStream (System.IO.Stream stream, PostProcessSteps postProcessFlags, System.String formatHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Model.Load (OpenWorld.Engine.AssetLoadContext context, System.IO.Stream stream, System.String extensionHint) [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Asset+<Load>c__AnonStorey0`1[OpenWorld.Engine.Model].<>m__0() [0x00000] in <filename unknown>:0 
    at OpenWorld.Engine.Game.DeferRoutines() [0x00000] in <filename unknown>:0 
    at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0 

這裏是我使用的代碼,基本上等同於一個在Doc:設置一個場景中的攝像頭和一個對象。我正在使用存儲庫中提供的資產,並驗證資產路徑是否正確。

using System; 
using System.IO; 
using OpenWorld.Engine; 
using System.Drawing; 
using OpenTK.Graphics; 
using OpenWorld.Engine.SceneManagement; 
using OpenTK; 

namespace OpenWorldLearn { 

    public class TestGame : Game { 
     Scene scene; 
     PerspectiveLookAtCamera camera; 

     protected override PresentationParameters GetPresentationParameters() { 
      var def = base.GetPresentationParameters(); 
      def.GraphicsMode = new GraphicsMode(24, 24, 0, 0); 
      def.Resolution = new Size(800, 600); 
      def.IsFullscreen = false; 
      def.Title = "Potato!"; 
      return def; 
     } 

     protected override void OnLoad() { 
      FrameBuffer.ClearColor = OpenWorld.Engine.Color.CornflowerBlue; 

      Assets.Sources.Add(new FileSystemAssetSource("../../../Assets")); 

      camera = new PerspectiveLookAtCamera(); 
      camera.FieldOfView = 90; 
      camera.LookAt(new Vector3(-0.1f, 1.9f, -4f), Vector3.Zero); 

      scene = new Scene(); 

      SceneNode child = new SceneNode(); 
      var renderer = child.Components.Add<Renderer>(); 
      renderer.Model = Assets.Load<Model>("crate"); 
      scene.Root.Children.Add(child); 
     } 

     protected override void OnUpdate(GameTime time) { 
      scene.Update(time); 
     } 

     protected override void OnDrawPostState(GameTime time) { 
      FrameBuffer.Clear(); 
      scene.Draw(this.camera, time); 
     } 
    } 
} 
+0

顯然,這不會在Linux上工作......我也非常懷疑它不適用於Windows 7. – leppie 2015-02-06 11:48:45

+0

那麼,至少在Xamarin Studio for Windows中,我會得到相同的結果。 (我永遠不會下載7GB的IDE,需要一個月的時間) – Kroltan 2015-02-06 11:51:12

+1

Assimp.NET只使用kernel32中的3個函數(libc也提供類似的功能)。但鑑於它會嘗試加載DLL,它仍然不會在非Windows上工作。我建議你尋找該庫的非Windows端口。 – leppie 2015-02-06 11:54:25

回答

1

我想我已經制定了這是怎麼回事 - 它在尋找一個叫於LD_LIBRARY_PATH用P Assimp32.so/Assimp64.so文件/調用dlopen,但這總是返回IntPtr.Zero因爲它真的叫libassimp.so,在被發現/usr/lib/libassimp.so如果你在32位ubuntu 14.04上安裝libassimp-dev。 (注:有你裝assimp本地標題爲您的平臺?)

此外,如果是我,我會重構這個本身與標準縱信任CLR做dlopen/dlsym/dlclose/Invoke的,而不是直接手卷此pinvokes到操作系統API。然後你可以用DllImportAttribute用extern方法有效地替換AssimpFunctionNames中的const函數名稱。 OTOH是我認爲合理的一個地方,它是DarkJava,其中函數名稱在編譯時確實不知道。

+0

你好,很抱歉,很遲纔回復。我下載了最新的AssimpNet源代碼並修改了代碼,以便正確查找'/ usr/lib/libassimp.so',現在又出現了一個新問題:Assimp試圖從'Assimp.InternalInterop'調用未實現的方法。 (實際上,整個班級都沒有實現)以下是堆棧跟蹤:http://pastebin.com/wXhtwezC。 – Kroltan 2015-02-21 19:03:35

+0

確實[this](https://www.google.co.uk/url?sa=t&source=web&rct=j&ei=ROboVILrGoS-PJj3gPAB&url=http://stackoverflow.com/questions/1086294/convert-array-of- structs-to-intptr&ved = 0CBwQFjAA&usg = AFQjCNEkkE3c1usHaeR4yv1M5yFwrMSHXw&sig2 = T1a_k9qLLfGng2RYUbox_w)help?元帥已經有將原語放入本地數組的方法。但問一個新的問題.... – 2015-02-21 20:12:59