InvalidProgramException im Designer wegen geleerter XNA-dll

  • WPF

    InvalidProgramException im Designer wegen geleerter XNA-dll

    Ich verwende XNA in einer WPF-Anwendung um auf einen angeschlossenen Controller zuzugreifen. Im WPF Designer wird Code ausgeführt, der die Funktion Microsoft.Xna.Framework.Input.Gamepad.GetState aufruft.
    Das Problem ist: Wenn der Code im Designer ausgeführt wird, dann wird die DLL in so einen temorären Ordner kopiert: C:\Users\Niko\AppData\Local\assembly\dl3\OY0GRB8E.WKH\91AET2PZ.112\110ffcf5\008430ff_b541d001\Microsoft.Xna.Framework.dll
    Dekompiliert man die Dll sieht man, dass alle Methoden "geleert" wurden:

    CIL-Quellcode

    1. .class public auto ansi abstract sealed Microsoft.Xna.Framework.Input.GamePad
    2. extends [mscorlib]System.Object
    3. {
    4. .method public hidebysig static valuetype Microsoft.Xna.Framework.Input.GamePadState GetState(valuetype Microsoft.Xna.Framework.PlayerIndex playerIndex) cil managed
    5. {
    6. .maxstack 8
    7. IL_0000: ret
    8. }
    9. .method public hidebysig static valuetype Microsoft.Xna.Framework.Input.GamePadState GetState(valuetype Microsoft.Xna.Framework.PlayerIndex playerIndex, valuetype Microsoft.Xna.Framework.Input.GamePadDeadZone deadZoneMode) cil managed
    10. {
    11. .maxstack 8
    12. IL_0000: ret
    13. }
    14. .method public hidebysig static valuetype Microsoft.Xna.Framework.Input.GamePadCapabilities GetCapabilities(valuetype Microsoft.Xna.Framework.PlayerIndex playerIndex) cil managed
    15. {
    16. .maxstack 8
    17. IL_0000: ret
    18. }
    19. .method public hidebysig static bool SetVibration(valuetype Microsoft.Xna.Framework.PlayerIndex playerIndex, float32 leftMotor, float32 rightMotor) cil managed
    20. {
    21. .maxstack 8
    22. IL_0000: ret
    23. }
    24. }

    Das könnte daran liegen, dass als Verweis C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\WindowsPhone\v8.1\Microsoft.Xna.Framework.dll angegeben ist und soweit ich das sehe sind alle DLLs C:\Program Files (x86)\Reference Assemblies\ nach dem Schema "geleert".
    Diese Methoden sind aber ungültiger Code. Methoden, die was zurückgeben, müssen vor dem ret-OpCode das zurückzugebende Objekt auf dem Auswertumgsstapel liegen lassen. Das ist hier nirgends der Fall. Deshalb meckert der JIT-Compiler beim Ausführen:

    Quellcode

    1. System.InvalidProgramException: Die Common Language Runtime hat ein ungültiges Programm gefunden.
    2. bei Microsoft.Xna.Framework.Input.GamePad.GetState(PlayerIndex playerIndex)
    3. bei GamepadControl.GamepadData.Gamepad..ctor(PlayerNumber NewPlayerNumber)


    Das Problem ist jetzt folgendes:
    Ich müsste vor jeder Verwendung von irgendwas aus der XNA-DLL abfragen, ob der Code aktuell im Designer ausgeführt wird und wenn nötig den Teil überspringen. Und das passiert an einigen Stellen. Ich möchte nicht vor jeden Zugriff eine Abfrage hinklatschen müssen.

    Wie kann ich entweder den Designer dazu bringen, die richtige DLL zu verwenden oder alternativ das Problem anders umgehen?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils