C++/CLI Wrapper um DirectX 11 - FileLoadException zur Laufzeit

Improof

Erfahrenes Mitglied
Hallo liebe Community!

Seit Tagen schlage ich mich nun schon mit dieses Problem und finde absolut keine Lösung, darum wende ich mich jetzt an euch.
Auch im Netz finde ich übrigens keine Lösung zu meinem Problem, da es doch leicht speziell ist.
Zum Sachverhalt:

Ich habe vor kurzem angefangen in C# mal ohne XNA ein Spiel zu programmieren, besser gesagt eine kleine Engine. Dafür hab ich DirectX 11 über den C++/CLI-Wrapper "SlimDX" verwendet. Da ich noch ganz am Anfang bin nur auf 2d-Ebene. Irgendwann kam ich zu dem Punkt, Bilder zu rotieren und zu skalieren, leider bringt SlimDX da keine eigenen Methoden mit. Im Netz (https://code.google.com/p/slimdx/source/browse/#svn/branches/lite/SlimDX.Toolkit) fand ich dann jedoch von den Machern selbst einen Entwicklungszweig namens "SlimDX.Toolkit". Dort befindet sich z.B. ein SpriteBatch, dass dem von XNA nachinterpretiert ist. Dieser Branch ist allerdings nirgendwo zum Download freigegeben, zumindest konnte ich nichts finden. Darum hab ich die C++/CLI-Wrapper aus dem Entwicklungszweig selbst compiliert, Visual Studio gibt nach dem Einbinden dieser Library auch keine Fehler.
Nur beim Start des Programms, sobald auf irgendwas aus dem Wrapper zugegriffen wird, wirft .NET eine System.IO.FileLoadException - Eine Prozedur, die von "SlimDX_Test.dll" implementiert wird, kann nicht aufgerufen werden.

Ich habe nun wie gesagt schon im Netz gesucht und bin auf Tools wie z.B. "Dependency Walker" gestoßen, allerdings alles ohne Erfolg.

Noch zum System:
Ich verwende Windows 7 64 Bit, compiliere jedoch alles komplett auf x86 Basis, also 32 Bit.
Außerdem verwende ich .NET 4.5, hab aber auch schon andere Versionen getestet, ohne Erfolg.


Ich hoffe es kann mir von euch jemand helfen und schon mal ein großes DANKESCHÖN :)

improof
 

Spyke

Premium-User
Hast du eine genauere Fehlermeldung?
Im VS unter Debug->Windows->Modules (da müsst glaube sein) könnteste mal schaun ob deine DLL (in der richtigen Version) geladen wurde.
 

Improof

Erfahrenes Mitglied
Ich hab hier mal den StackTrace der Exception, der von VS ausgegeben wird:

FileLoadException wurde nicht behandelt.

Ein Ausnahmefehler des Typs "System.IO.FileLoadException" ist in GhostEngine_DEBUG.exe aufgetreten.
Zusätzliche Informationen: Eine von "SlimDX_Test.dll" importierte Prozedur konnte nicht geladen werden.

Um eine noch genauere Beschreibung zu geben, hier mal die von mir erstellten Projekte in der VS-Projektmappe:
  • SlimMath -> Basisklassen für mathematische Aufgaben, wie z.B. "Vector2"; hat keine Verweise
  • SlimDX_Test -> Der C++/CLI Wrapper; Interner Verweis auf SlimMath, Externe Verweise auf d3d11.lib, d3dcompiler.lib, dwrite.lib, DxErr.lib, dxgi.lib, X3DAudio.lib, XInput.lib, winmm.lib
  • GhostEngine -> Die eigentliche C#-Engine; Interne Verweise auf SlimMath und SlimDX_Test
  • GhostEngine_DEBUG -> Ein zum Testen und Debuggen erstelltes Programm, dass die Engine verwendet (quasi ein Testspiel); Interne Verweise auf SlimMath und GhostEngine

Danke für den Tipp mit VS, es werden diverse Microsoft-DLLs geladen, z.B. die mscorlib.dll, von meinen eigenen jedoch nur GhostEngine_DEBUG.exe und GhostEngine.dll.
Das heißt dann wohl, dass der Fehler beim Laden der SlimDX_Test.dll auftritt... wie mache ich hier nun weiter?


Außerdem hab ich hier mal noch die Ausgabe aus dem Dependency Walker beim Profilen meiner exe:

Started "GHOSTENGINE_DEBUG.EXE" (process 0x1FF8) at address 0x01360000. Successfully hooked module.
Loaded "NTDLL.DLL" at address 0x77E10000. Successfully hooked module.
Loaded "MSCOREE.DLL" at address 0x6EC50000. Successfully hooked module.
Loaded "KERNEL32.DLL" at address 0x76430000. Successfully hooked module.
Loaded "KERNELBASE.DLL" at address 0x77970000. Successfully hooked module.
DllMain(0x77970000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNELBASE.DLL" called.
DllMain(0x77970000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNELBASE.DLL" returned 1 (0x1).
DllMain(0x76430000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" called.
DllMain(0x76430000, DLL_PROCESS_ATTACH, 0x00000000) in "KERNEL32.DLL" returned 1 (0x1).
Injected "DEPENDS.DLL" at address 0x08370000.
DllMain(0x6EC50000, DLL_PROCESS_ATTACH, 0x00000000) in "MSCOREE.DLL" called.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" called.
DllMain(0x08370000, DLL_PROCESS_ATTACH, 0x00000000) in "DEPENDS.DLL" returned 1 (0x1).
GetProcAddress(0x76430000 [KERNEL32.DLL], "FlsAlloc") called from "MSCOREE.DLL" at address 0x6EC56F3C and returned 0x76444EF3.

STATUS_STACK_BUFFER_OVERRUN encountered
Entrypoint reached. All implicit modules have been loaded.
Exited "GHOSTENGINE_DEBUG.EXE" (process 0x1FF8) with code -1073740791 (0xC0000409).

Ich kann damit aber recht wenig anfangen, auch auf google finde ich hier keine Lösung.
 

Spyke

Premium-User
Hast du in den Verweisen/Referenzen dort wo du die slimdx_test.dll brauchst copylocal auf true?
Schau mal ob die DLL im ausgabeverzeichnis (debug oder release) ordner deiner startanwendung liegt.
(Und ev. ob mit richtiger Assembly- und Dateiversion)
Ansonsten kopier se mal testweise per hand da hin und schau mal obs dann noch läuft.

Könntest auch noch prüfen ob im Configurations Manager alle Projekte auf Build stehen.

Die startanwendung (und ev. die slim dll) ev. auch mal testweise mit x86 kompilieren.
 

Improof

Erfahrenes Mitglied
Ich hab meine Projektmappe mal komplett bereinigt und wieder neu erstellt.
Die dlls sind alle im Ausgabeverzeichnis, auch in der richtigen Version. Alle 4 Projekte stehen auf erstellen. Und ich kompiliere sowieso alles schon mit Debug/x86, bzw. Win32 bei dem C++/CLI (da gibts ja kein x86 zur Auswahl).

Ich hab grad auch mal alle DirectX-dlls ins Ausgabeverzeichnis kopiert, leider auch wieder ohne Erfolg.
 

Improof

Erfahrenes Mitglied
Hallo Leute,

erstmal sorry für den Doppelpost, aber ich hab jetzt nochmal einen Log mit fuslogvw gemacht.
Ergebnis: Kein Fehler! Ich weiß nicht warum, aber anscheinend werden alle Assemblies richtig eingebunden, dennoch entsteht immer noch die oben beschriebene Exception...

Hat noch jemand eine Idee, an was es dann liegen kann?! Weil mir gehen die Einfälle jetzt leider auch langsam aus...

Danke schon mal!

improof
 

Spyke

Premium-User
Ist denn erkennbar welche prozedur nicht geladen werden kann?
Ansonsten setzen mal mehrere Trace ausgaben und schau mal wie weit erläuft.

Könntest dein programm auch mal mittels application verifier laufen lassen, ev. ist da noch was erkennbar.
 

Improof

Erfahrenes Mitglied
Die Prozedur ist nicht erkennbar, leider. Er schreibt er auch nur "eine importierte Prozedur"...welche das ist, gibt er mir nicht aus >.<

Ich bin jetzt noch nicht dazu gekommen, deine Vorschläge auszuprobieren, aber zu dem Thema wie weit er läuft:
Meine main-Methode hat nur eine Codezeile "Game game = new Game();", wobei Game eine Klasse im Endprojekt ist. Die Klasse erbt von "GameApp", welche in meiner Engine-Lib vorhanden ist. Beim Aufruf des Base-Konstruktors (also von "GameApp") stürzt er ab...

Hab aber vorhin mehr aus Verzweiflung heraus nochmal ein komplett neues Projekt angelegt und die Dateien da rein kopiert. Gleiche Fehlermeldung (FileLoadException), jetzt steht da aber unter Lösungsvorschläge: "Stellen Sie sicher, dass die Datei eine gültige .Net Framework-Assembly ist."
Kann das denn sein, dass meine SlimDX_Test.dll, die ja mit C++/CLI kompiliert ist, keine gültige Assembly ist? Und wenn ja, warum? Nur mal grundsätzlich, falls nötig kann ich auch noch den Code von der AssemblyInfo.cpp posten.


Nochmals Danke!

improof