Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

11

29.06.2011, 09:52

ok jetzt meckert der compiler nur noch über diese das Car.
Er gibt mir in dem Fall auch keine Angaben darüber, was ich einfügen muss mit der Tastenkombination.

Mastermind

unregistriert

12

29.06.2011, 09:56

:) Ich glaube das Car war nur ein Beispiel. Ersetze es durch irgendeine von deinen Klassen, die du verwenden willst.

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

13

29.06.2011, 10:00

D.h. wenn ich in meinen Scriptfile ne Klasse definiert habe kann ich darüber ne Instanz davon erzeugen?

Mastermind

unregistriert

14

29.06.2011, 10:01

So versteh ich es, ja.

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

15

29.06.2011, 10:10

Ok dann danke für die Hilfe an alle, hab das jetzt verstanden :thumbsup:

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

16

29.06.2011, 10:10

Genau. folgendes beispiel:

Quellcode

1
namespace MyGameScripts.CarScripts{  public class Car  {    public void Update()    {      //do something    }  }}



Diese Klasse hast du in der Datei Car.cs. dann würdest du sie wie folgt kompilieren;

Quellcode

1
2
3
4
5
CSharpCodeProvider c = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters()     {    GenerateExecutable = false,   GenerateInMemory = true,  OutputAssembly = "test.dll",};cp.ReferencedAssemblies.Add("System.dll");CompilerResults compilerResults = c.CompileAssemblyFromFile(cp, "Car.cs");
if (compilerResults.Errors.Count > 0)            {                  //fehler...            }
Assembly assembly = compilerResults.CompiledAssembly;
//instanz des autos erzeugen und fkt aufrufenCar car = assembly.CreateInstance("MyGameScripts.CarScripts.Car") as Car;car.Update();



also du musst wissen, wie deine cs-Datei heisst, wie der Namespace und Name der Klasse ist. Dadurch kannst du eine Instanz der Klasse erzeugen und wie ein stinknormales objekt im code benutzen ;)

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

17

29.06.2011, 11:33

Anscheinend zu früh gefreut :( Krieg es nicht hin, dass die cs datei benutzt wird.

Hier der Code: Program.cs

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using Scripts.CarScripts;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
         CSharpCodeProvider c = new CSharpCodeProvider();
         CompilerParameters cp = new CompilerParameters()
        {
            GenerateExecutable = false,
            GenerateInMemory = true,
            OutputAssembly = "test.dll",
        };                                                                         

         cp.ReferencedAssemblies.Add("System.dll");
         CompilerResults compilerResults = c.CompileAssemblyFromFile(cp, "Car.cs");
         int errors = compilerResults.Errors.Count;
         if ( errors > 0)
         {                //fehler... 
             Console.Write("Error");
     
         }
         else
         {
             Assembly assembly = compilerResults.CompiledAssembly;
             Car car = assembly.CreateInstance("Scripts.CarScripts.Car") as Car;
             string s = car.Update();
             Console.Write(s);
         }
        }
    }
}


und Car.cs:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
namespace Scripts.CarScripts
{
 public class Car
 {
  public string Update()
  {
   return "Car-Update";
  }
 }
}

Problem ist folgendes: Angeblich wird Car.cs Datei richtig kompiliert (errors ist 0). Allerdings tritt eine Nullpointerexception auf, sobald Update() aufgerufen werden soll.
Die Car.cs -Datei ist sowohl im bin/Debug- Verzeichnis, als auch im Projektordner (in vs verweise ich aber nur auf die cs-Datei im Projektordner, damit er Car kennt).

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

18

29.06.2011, 12:11

was passiert denn, wenn du folgendes eingibst?

Quellcode

1
Console.Write(assembly.CreateInstance("Scripts.CarScripts.Car").GetType().FullName)

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

19

29.06.2011, 13:22

Das einzige was kommt ist: Scripts.CarScripts.Car

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

20

29.06.2011, 13:27

Das Problem wird sein, dass CreateInstance dir die Richtige Instanz liefert, aber auf den falcshen Typ gecastet wird. wenn du im Code Console.Write(typeof(Car).FullName) machst, wird dort die klasse sein, die in deinem c# projekt ist. ich habe das problem mit einem Interface gelöst, welche alle Scripte implementieren. somit kann ich auf diesen bekannten typ casten.

Werbeanzeige