2 Stimmen

Bereitstellen einer C#-Anwendung, die DirectX-Assemblys verwendet

Ich entwickle eine Anwendung, die DirectX für das Grafik-Rendering verwendet. Ich muss darauf hinweisen, dass ich weder XNA noch SlimDX verwende, obwohl ich das wahrscheinlich tun sollte. Allerdings wusste ich das zu Beginn des Projekts nicht, und jetzt ist es zu spät, da die Umstellung auf eines dieser Systeme sehr viel Zeit in Anspruch nehmen würde.

Allerdings muss ich die Anwendung für die Benutzer bereitstellen. In meinem Projekt habe ich die folgenden Baugruppen referenziert:

  • Microsoft.DirectX
  • Microsoft.DirectX.Direct3D
  • Microsoft.DirectX.Direct3DX

Ich brauche nur diese Baugruppen, sonst nichts. Die Benutzer müssen DirectX als Voraussetzung auf ihren Computern installiert haben. Daher fand ich die Aufnahme dieser DirectX-DLLs in meinen Anwendungsordner oder in die GAC unnötig.

Ich habe Probleme mit einigen Umgebungen, während andere perfekt funktionieren. Ich habe das Problem darauf zurückgeführt, ob DirectX-Assemblies in %windir% registriert sind \assembly. Wenn hier DirectX-Assemblies aufgeführt sind, wird die Anwendung ausgeführt. Ist dies nicht der Fall, schlägt der Start fehl.

Das Problem ist, dass, obwohl DirectX auf allen Computern installiert ist (dxdiag funktioniert, DirectX-Dateien werden darin aufgelistet), auf einigen von ihnen diese Baugruppen nicht aufgeführt sind. Wenn dies geschieht, schlägt die Anwendung mit der Ausnahme System.IO.FileNotFound fehl:

Die Datei oder Assembly 'Microsoft.DirectX.Direct3D, Version=1.0.2902.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Das System kann die angegebene Datei nicht finden.

Wenn zum Beispiel das neueste eigenständige Installationsprogramm von der Microsoft-Website heruntergeladen und installiert wird, werden die Baugruppen registriert. Ich bin mir nicht sicher, wie es sich verhält, wenn sie nicht installiert werden, aber das kommt vor. Oft.

Meine Fragen:

  1. Warum registriert DirectX diese Assemblies manchmal und manchmal nicht?
  2. Wie referenziert man DirectX-Assemblies am besten aus der Anwendung zu verweisen?

2voto

Daniel van Os Punkte 41

Ich habe ähnliche Erfahrungen mit der SimConnect DLL gemacht, die Bestandteil von Flight Simulator ist. In diesem Fall stellte sich heraus, dass die DLL nicht zum GAC hinzugefügt wurde, wenn ein Benutzer Flight Simulator vor der Installation des .Net-Frameworks installiert hatte.

Ich vermute, dass hier etwas Ähnliches passiert.

Dies bedeutet natürlich, dass das Problem nur auf XP-Systemen auftreten kann, auf denen .Net nicht standardmäßig installiert ist, und dass es nach einer Neuinstallation von DX nach der Installation von .Net behoben werden sollte.

2voto

MikeP Punkte 7602

Ich bin nicht überrascht, dass Sie diese Probleme haben. Sie verlassen sich auf eine extrem alte, abgekündigte und nicht mehr unterstützte API. Die neuesten Runtime-Installationsprogramme installieren die Baugruppen noch aus Kompatibilitätsgründen, aber sie sind nicht standardmäßig enthalten, weil sie nicht erwarten, dass jemand sie verwendet.

Ehrlich gesagt, sie sind wirklich alt (etwa 10 Jahre), sie haben zahlreiche bekannte Fehler und Probleme, die niemals repariert werden, und es gibt durchaus akzeptable Ersatzprodukte. Sie sollten entweder zu einem von ihnen wechseln oder sich damit abfinden, dass Sie mit Problemen wie diesem zu kämpfen haben, solange Sie Ihre Anwendung unterstützen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X