Problem mit DLL (für Game Maker)

  • C#

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit DLL (für Game Maker)

    Hi.
    Ich habe mir Microsoft Visual C# 2008 Express Edition heruntergeladen und wollte damit eine DLL für den Game Maker schreiben. (Habe dazu das Delphi Beispiel in der Hilfe so angepasst, dass keine Errors kommen :P)
    Mein Code sieht derzeit so aus:

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace ClassLibrary1
    6. {
    7.   public class Class1
    8.   {
    9.   public static double Double (int i)
    10.   {
    11.   return i * 2;
    12.   }
    13.   }
    14. }
    Alles anzeigen


    (Ja ich weiß, diese DLL (sollte) nur das Doppelte zurückgeben :P)
    So, jetzt hab ich die DLL ("MyDll.dll") erstellt und ins Verzeichnis von meiner GMK Datei gelegt.
    Dann habe ich ein neues Script erstellt (mydll_init), in welchem folgender Code steht:

    GML-Quellcode

    1. global._getDouble = external_define("MyDll.dll","Double", dll_stdcall, ty_real, 1, ty_real);


    Jetzt habe ich noch ein Script (mydll_getdouble), in welchem dieser Code hier steht:

    GML-Quellcode

    1. return external_call (global._getDouble, argument0);

    Das Problem ist jetzt, dass ich beim Aufruf folgenden Error bekomme:

    Quellcode

    1. ERROR in
    2. action number 1
    3. of Create Event
    4. for object obj_gehts:
    5. Error defining an external function.


    obwohl die DLL im Spielverzeichnis liegt.
    Also muss ich etwas beim Schreiben der DLL falsch gemacht haben.
    Weiß einer von euch, was ich ändern muss, damit diese DLL auch im GM funktioniert?
    Danke schon mal.
    -fabse64 :D
    fabse64 -> haiyyu
  • Das kann so nicht gehen. C# DLLs haben zwar auch die Dateiendung .dll, haben aber sonst fast nichts mit den "normalen" DLLs zu tun. Deshalb kann man diese DLLs auch nicht ohne weiteres im GM verwenden. Eine bekannte (und in der GMC beschriebene) möglichkeit liegt im Disassemblieren des Assemblies, Anpassen des CIL-Codes und wieder Assemblieren. Das klingt nicht nur umständlich sondern ist es auch.

    Eine andere Möglichkeit, die ich auch schonmal getestet habe, und die bei mir gut funktioniert hat, ist der GM .net Layer. Das ist eine normale GM-Dll, die dann den Zugriff auf C#/.NET-DLLs ermöglicht.

    Ich habe auch mal eine kleine GM 7 Extension damit geschrieben, die einige .Net-Klassenbibliothek-Funktionon (z.B. Regex) für den GM zur Verfügung stellt. Ich weiß aber gerade nicht wo bzw. ob ich die noch habe. Wenn ich sie finde, werde ich es euch mitteilen.

    Für weitere Rückfragen zu diesem Thema stehe ich dir gerne zur Verfügung.
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • Ich hatte mal so ein ähnliches Problem, allerdings brauchte ich eine Visual C++ dll für den
    Borland Builder und da war so ein kleines Programm dabei, mit dem man die dll umwandeln
    konnte. Allerdings weiß ich nicht, ob Borland dll in Ordnung ist :)
    (Wenn ja schau ich nochmal nach)
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Wollte dafür keinen neuen Thread aufmachen, aber kann man mit DLL's auch GML Code ausführen lassen?

    Und das C# net geht ist schlecht.... ich habe erst vor ca. 3 Wochen von C++ auf C# gewechselt, weil ich mit VC# besser als mit VC++ zurecht komme :(

    Mfg.,
    Metalknight
  • Wenn ich das recht verstehe, ist das grundlegende Problem nicht C# sondern das Visual davor.
    Dieses steht nämlich für gewisse Abweichungen vom eigentlichen Standart und somit werden
    die dlls nicht allgemein benutzbar.
    GML Code kann man nicht mit einer dll ausführen, da gml eine interpretierte Sprache ist und
    den Runner benötigt, um laufen zu können. Du kannst allerdings eine Extension machen und
    deinen Code in die einbinden, das geht.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • "Problem" ist, dass man mit C# .Net Dlls macht. GM will und kann aber nur Win32 Dlls mit C Style API ansprechen. Das sind zwei verschiedene Systeme die untereinander nicht direkt interoperabel sind.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Ums einfach konkret auf den Punkt zu bringen:

    "Normale" Win32 Dlls enthalten Maschinencode / Assemblercode.
    .Net Dlls enthalten aber Bytecode, wie Java. Für den GM steht dann also unverständliches Zeug drinne.

    Aber die GM.Net Layer Dll zu nutzen is doch jetz nich soo schlimm.