2016-04-09 5 views
-2

Ich mache ein Projekt in C# mit einer .dll. Um die .dll-Ausgabe in eine richtextbox (die ich als Konsole verwende) zu schreiben, habe ich einen Listener gemacht, der überprüft, ob sich eine Variable in der .dll geändert hat, und wenn ja, gebe diese Variable in der richtextbox aus. Dieser Teil funktioniert. Allerdings funktioniert die Aufrufmethode nicht (denke ich), da sich die Variable nicht ändert, wenn ich den Aufruf verwende. Dies ist mein Code in der Exe:method.Invoke() scheint nicht zu arbeiten C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Reflection; 

namespace Dark_Magic_Origins 
{ 
    public partial class game : Form 
    { 
     static string listenerPath; 
     static string prevOutput = String.Empty; 
     static Assembly DLL; 
     static MethodInfo method; 
     static Type theType; 
     static object c; 

     public game() 
     { 
      InitializeComponent(); 
     } 

     private void game_Load(object sender, EventArgs e) 
     { 
      this.FormClosing += new FormClosingEventHandler(closingThaForm); 

      if (WhatIsNext.whatsNext.Equals("new")) 
      { 
       timer.Interval = 500; 
       timer.Enabled = true; 

       loadDLL(Application.StartupPath + @"\bin\story\Chapter 1.dll", "Chapter_1.Class1", "guideLine"); 

       method.Invoke(c, new object[0]); 
      } 
     } 

     private void closingThaForm(object sender, FormClosingEventArgs e) 
     { 
      if (SharedVars.closeProgram == true) 
      { 
       Application.Exit(); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (String.IsNullOrWhiteSpace(txtInput.Text)) 
      { 
       System.Media.SystemSounds.Exclamation.Play(); 
      } 
      else if (SharedVars.enableSpeech == true) 
      { 
       console.Text += Environment.NewLine + "<" + SharedVars.name + "> " + txtInput.Text; 
       txtInput.Text = String.Empty; 
      } 
      else 
      { 
       System.Media.SystemSounds.Exclamation.Play(); 
      } 
     } 

     private void loadDLL(string path, string namespaceDotClass, string Method) 
     { 
      DLL = Assembly.LoadFile(path); 

      theType = DLL.GetType(namespaceDotClass); 
      c = Activator.CreateInstance(theType); 
      method = theType.GetMethod(Method); 
     } 

     private void timer_Tick(object sender, EventArgs e) 
     { 
      IList<FieldInfo> fields = new List<FieldInfo>(theType.GetFields()); 

      object fValue = new Object(); 
      foreach (FieldInfo f in fields) 
      { 
       if (f.Name.Equals("output")) 
       { 
        fValue = f.GetValue(c); 
        break; 
       } 
      } 

      if (!prevOutput.Equals(fValue.ToString())) 
      { 
       console.Text += Environment.NewLine + fValue.ToString(); 
       prevOutput = fValue.ToString(); 
      } 
     } 
    } 
} 

Dies ist mein DLL-Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Chapter_1 
{ 
    public class Class1 
    { 
     public string output = String.Empty; 
     static Class1 var = new Class1(); 

     public void guideLine() 
     { 
      one(); 
     } 

     private void one() 
     { 
      var.output = "Once upon a time, in the realm of Sehrli..." + 
       Environment.NewLine + "...there was a... a... what, actually? From which race are you?" + 
       Environment.NewLine + "1) Human" + 
       Environment.NewLine + "2) Elf" + 
       Environment.NewLine + "3) Dwarf" + 
       Environment.NewLine + "4) Guardian" + 
       Environment.NewLine + "5) Angel" + 
       Environment.NewLine + "6) Qanadli" + 
       Environment.NewLine + "(Type the number of the option you want to select, or type 'info' and a number to get more info (e.g. info 3))"; 
     } 
    } 
} 

Ich habe versucht, es so löse mich, aber ich nicht (offensichtlich). Wer irgendwelche Ideen? Danke im Voraus.

+0

Welche Variable ändert sich nicht? Ich sehe keinen Code, der versucht, den Nebeneffekt des Aufrufs von 'guideLine()' in der DLL zu verwenden, aber beachte, dass deine 'one()' Methode den Wert der 'output' Variablen in a vollständig ändert andere Instanz von 'Class1' als Sie verwenden, um die Methode aufzurufen. Sie müssten auf diese Instanz zugreifen, um die Änderung zu sehen, oder das Feld "var" ganz loswerden und einfach die aktuelle Instanz verwenden. Ich empfehle Ihnen auch, die Verwendung von "var" als Variablennamen zu vermeiden, da "var" ein reserviertes Wort in C# ist. –

+0

Es ist schwierig, Ihre Frage zu verstehen. Stellen Sie eine gute [mcve] bereit, die das Problem zuverlässig reproduziert, zusammen mit einer detaillierten und präzisen Beschreibung dessen, was dieser Code tut und was er stattdessen tun soll. Bitte beachten Sie, dass es für die Zwecke eines MCVE scheint, dass Sie die DLL nicht benötigen, da es scheinbar nur Probleme mit dem dynamisch erstellten Objekt gibt. Es gibt hier auch viel Code, der eindeutig nichts mit der Frage zu tun hat. –

Antwort

-1

Entschuldigung für den Mangel an Informationen. Aber ich habe die var Variable losgeworden, wie Peter Duniho vorgeschlagen hat, und das hat funktioniert! So danke!

Warum verwende ich eine .dll? Ich möchte mein Programm so gestalten, dass ich, wenn ich neue Inhalte hinzufügen möchte, nur eine neue DLL erstellen muss. Aber ich wollte mich zuerst an .dll's gewöhnen. Deshalb scheint diese .dll ein wenig sinnlos zu sein.

Vielen Dank für Ihre Hilfe!