Direct3D Code läuft nur auf Entwicklungs PC
-
Hm. Kannst du vielleicht auf noch einem anderen PC probieren wo das SDK nicht drauf ist? Könnte schlicht und einfach der Treiber kaputt bzw. fehlerhaft sein...
-
Ich hab ne Vermutung.
Ich habe ja zum programmieren 3 DLL's von Direct3D verwendet. ich vermute einfach mal das diese 3 zum laufen noch weitere benötigen. Ich habe mal versucht die dll's mit hilfe einer option : lokale kopie, mitzuliefern, doch dann is mein programm nicht mehr lauffähig gewesen. Im Moment habe ich mir einen ordner dll's angelegt wo ich diese lokalen kopien reingelegt habe. danach habe ich die option wieder ausgeschaltet und die dll's mit dem neuen pfad eingebunden. Siehe an es läuft wieder auf dem entwicklungsPC, jedoch immer noch nicht auf dem Zielsystem oder einem anderen rechner. könnte es nun noch sein das diese dll's weitere directxdll's benötigen um korrect zu laufen? mir gehn so langsam die ideen aus was ich machen kann. Eins hab ich och festgestellt. Auf meinem entwicklungsrechner hab ich n haufen directx dll's in meinem windowspfad welche auf keinem anderen rechner vorhanden sind die kein directxSDK besitzten. Hat das etwas damit zu tun?
Gruss Trider
-
Was für DLLs???
-
Ich vermute, er benutzt MDX und das ist auf dem Zielrechner nicht installiert. In diesem Fall meckert er beim Laden jeder abhängigen Assembly, so dass ein try-catch auch nicht mehr greift. Es reicht nicht, die MDX-DLLs in das selbe Verzeichnis zu stecken, sie müssen im GAC registriert sein und die EULA erlaubt dies nur über DXSetup.
-
Diese Fehlermeldung "...hat ein Problem festgestellt und muss beendet werden" weisst doch meistens auf eine Speicherschutzverletzung hin oder ? Ich habe mir damit auch mal die Zähne ausgebissen, bis ich dann feststellte, dass auf dem Zielrechner ein RAM Riegel defekt war

-
Nein, dieser Dialog kommt bei jeder ungefangenen Exception.
-
Die dll's die ich erwähnte sind : Microsoft.DirectX.dll, Microsoft.DirectX.Direct3D.dll, Microsoft.DirectX.Direct3DX.dll. Diese dll's hab ich meinen Verweisen hinzugefügt und mit using dann im programm eingebunden...
ok fehler gefunden, aber wie ich ihn beheben kann hab ich keine ahnung.
Also das hab ich gemacht :
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using Microsoft.DirectX.Direct3D; using Microsoft.DirectX; namespace simpleform { public partial class Form1 : Form { bool add_once = true; /* device params */ private Device device = null; /* Kontrollvariablen um Objekte auszublenden */ private bool show_buendel = true; private bool show_koerper = false; private bool show_gitter_koerper = false; private bool strafe = false; private bool show_bohrloecher = true; private bool show_meshnummern = false; /* Globale informationen */ /* später eingebbar */ private float brushes_amount_each_circle = 50; private float brushes_cur_abstand = 0.0f; private float brushes_abstand_inc = 2.0f; int meshes_to_sign = 5000; /* Kamera Bewegung Variablen Matrix mcam_rotate_x = Matrix.Identity; Matrix mcam_rotate_y = Matrix.Identity; Matrix mcam_rotate_z = Matrix.Identity; Matrix mcam_world = Matrix.Identity; float rot_value_x = 0; float rot_value_y = 0; float rot_value_z = 0; /* Mesh Variablen */ Mesh tubeMesh; Mesh koerperMesh; /* float Cylinder_length = 2f; int cylinder_slices = 5; int cylinder_stacks = 2; private float koerper_radius = 30f; Matrix[] rotationen; float abstand_z_inc = 2; float[] winkel; float[] tiefe_ebene; /* Variablen für einschrenkungen */ int von_winkel = 45; int bis_winkel = 360; /* Buendeldrehung Matrix kippen_y = Matrix.Identity; Matrix kippen_x = Matrix.Identity; float kippen_y_inc = 5; float kippen_x_inc = 5; int tmp_offset_kippen_l = 0; int tmp_offset_kippen_b = 0; int tmp_offset_kippen_all_laenge_l = 0; int tmp_offset_kippen_all_laenge_b = 0; int tmp_offset_kippen_all_breite_l = 0; int tmp_offset_kippen_all_breite_b = 0; /* Kamera Params */ private float camDistance = 200f; private float cam_pos_x = 40f; private float cam_pos_y = 40f; private float cam_pos_z = 0f; private bool camMove = false; private Point mousePtLastPosit; private Point mousePtCurrentPosit; /* Koordinatensystem Variablen private VertexBuffer vertexBuffer = null; private VertexBuffer vertexBuffer_gitter = null; /* intersect hilfe */ int intersected_position = -1; /* Gitter Variablen //Vertex[] gitter; Matrix gitter_position = Matrix.Identity; /* Thread Variablen */ Thread t; /* Buendelbewegung */ int tmp_offset_x_move = 0; int tmp_offset_y_move = 0; int tmp_offset_z_move = 0; /* Koordinatensystem Struktur struct Vertex { float x, y, z; int color; public Vertex(float _x, float _y, float _z, int _color) { x = _x; y = _y; z = _z; color = _color; } public void setData(float _x, float _y, float _z, int _color) { x = _x; y = _y; z = _z; color = _color; } public static readonly VertexFormats FVF_Flags = VertexFormats.Position | VertexFormats.Diffuse; }; Vertex[] lineVertices = { new Vertex( -10000.0f, 0.0f, 0.0f, Color.Red.ToArgb() ), // red = +x Axis new Vertex( 10000.0f, 0.0f, 0.0f, Color.Red.ToArgb() ), new Vertex( 0.0f, -10000.0f, 0.0f, Color.Green.ToArgb() ), // green = +y Axis new Vertex( 0.0f, 10000.0f, 0.0f, Color.Green.ToArgb() ), new Vertex( 0.0f, 0.0f, -10000.0f, Color.Blue.ToArgb() ), // blue = +z Axis new Vertex( 0.0f, 0.0f, 10000.0f, Color.Blue.ToArgb() ), }; */ public Form1() { InitializeComponent(); }Also das Programm lässt sich NICHT starten solbald ich eine Matrix oder die Struktur Vertex initialisieren möchte. Komischerweise funktioniert aber die initialisierung von einem Mesh und einem Device. ich hab vil geklammert, da ich nicht remote debuggen konnte. Ich hoffe ihr erkennt die zugehörigkeiten
ansonsten schreib ich es mal um...Habt ihr ne idee warum er mir bei den 2 initialisierungen global in der klasse aussteigt?
Gruss Trider
-
Ich habe in den Projekteigenschaften einige einstellungen unternomen, sodass er den code auf dem zielrechner compiliert und dann ausführt. nur dann bekomm ich eine fehlermeldung die mit direct x zu tun hat :
Die DLL "C:\WINDOWS\assembly\GAC\Microsoft.DirectX.Direct3D\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.Direct3D.dll" unternimmt einen Versuch, innerhalb der Sperre für den OS-Loader eine verwaltete Ausführung durchzuführen. Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, da dies ein Hängen der Anwendung zur Folge haben kann.
er bleibt bei der initialisierung stehn : Form1 frm = new Form();
das oben beschriebene Problem mit den Matrizen und vertex besteht aber immer noch!
irgend ein rat?
Gruss Trider
-
Die von dir beschriebene Meldung ist ein Bug in MDX, der aber nur beim Debuggen auftritt. Du kannst in VS den LoaderLock Assistant ausstellen, um den Hinweis zu unterdrücken (Debug -> Exceptions).
Die dll's die ich erwähnte sind : Microsoft.DirectX.dll, Microsoft.DirectX.Direct3D.dll, Microsoft.DirectX.Direct3DX.dll.
Wie gesagt. Du hast MDX auf dem Zielrechner nicht installiert.
-
muss ich das komplette sdk auf dem zielrechner auch installieren? das wäre ja echt böse platzverschwendung (hab nicht viel).MDX = Managed DirectX. gibt es da ein spezielles MDX für windows was kleiner ist? das SDK das ich mit vs8 benutze hat 500 MB und installiert keine ahnung. gibt es da eine abgespeckte version die nicht so gross ist, die aber ausreicht um den code auszuführen? oder kann man die benötigten dll's einfach in einem extra ordner einfach mitliefern?
Gruss Trider
-
Es gibt das MDX Redistributable zum herunterladen bei MS oder beim SDK dabei (wenn man es mitinstalliert).