tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
1021
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    lordfritte lordfritte ist offline Mitglied Brokat
    Registriert seit
    Mar 2006
    Beiträge
    256
    Hallo ich befasse mich zur Zeit mit .NET Scripting und bin schon auf ein Problem gestoßen,
    Ich möchte in meinem Programm eine Zeile in meiner Anwendung als Script ausführen.
    In meinee Scriptzeile möchte ich ein Objekt(ScriptElements) über eine Variable x nutzen,
    hier mein Code:
    PHP-Code:
    namespace Scripting
    {
      public class 
    ScriptingSample
      
    {
        public 
    void Main(string[] args)
        {
          
    string sScriptLine "x.Date();";

          
    ScriptElements elements = new ScriptElements();
          
    ScriptManager manager = new ScriptManager();

          
    Console.WriteLine(manager.RunScript(elementssScriptLine));

          
    Console.ReadKey();
        }

      }

      
    #region ScriptManager

      
    public class ScriptManager
      
    {
        List<
    stringarrList = new List<string>();
        public 
    delegate string ScriptRun(ScriptElements x);
        public 
    ScriptRun runDelegate;

        public 
    ScriptManager()
        {
          
    arrList.Clear();
          
    arrList.Add("System.dll");
          
    arrList.Add("System.Windows.Forms.dll");
        }

        public 
    string RunScript(ScriptElements xstring sScriptLine)
        {
          
    string sRes "";

          
    CodeCompileUnit compileUnit = new CodeCompileUnit();
          
    CodeNamespace nameSpace = new CodeNamespace("Scripting");
          
    CodeTypeDeclaration reletionClass = new CodeTypeDeclaration("ScriptClass");
          
    CodeMemberMethod calculationFunction = new CodeMemberMethod();
          
    CompilerResults compilerResults null;
          
    object objFunc;

          
    compileUnit.Namespaces.Add(nameSpace);
          
    compileUnit.ReferencedAssemblies.AddRange(arrList.ToArray());
          
    nameSpace.Imports.Add(new CodeNamespaceImport("System"));
          
    nameSpace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
          
    nameSpace.Types.Add(reletionClass);
          
    reletionClass.IsClass true;
          
    reletionClass.TypeAttributes System.Reflection.TypeAttributes.Public;
          
    reletionClass.Members.Add(calculationFunction);
          
    calculationFunction.Attributes MemberAttributes.Public;
          
    calculationFunction.ReturnType = new CodeTypeReference(typeof(string));
          
    calculationFunction.Name "Run";
          
    calculationFunction.Parameters.Add(new CodeParameterDeclarationExpression(typeof(ScriptElements), "x"));
          
    calculationFunction.Statements.Add(new CodeMethodReturnStatement(new CodeSnippetExpression(sScriptLine)));

          
    CompilerParameters compilerParameters = new CompilerParameters();
          
    compilerParameters.GenerateInMemory true;

          
    CSharpCodeProvider csharp = new CSharpCodeProvider();
          
    compilerResults csharp.CompileAssemblyFromDom(compilerParameterscompileUnit);

          if ((
    compilerResults != null) && (compilerResults.Errors.Count 0))
          {
            for (
    int i 0compilerResults.Errors.Counti++)
            {
              
    MessageBox.Show(compilerResults.Errors[i].ToString());
            }
          }
          else
          {
            
    objFunc compilerResults.CompiledAssembly.CreateInstance("Scripting.ScriptClass"true);
            
    runDelegate = (ScriptRun)Delegate.CreateDelegate(typeof(ScriptRun), objFunccalculationFunction.Name);

            if (
    runDelegate != null)
              
    sRes runDelegate(x);
          }

          return 
    sRes;
        }
      }

      
    #endregion

      #region ScriptElements

      
    public class ScriptElements
      
    {
        public 
    ScriptElements()
        { }

        public 
    string Date()
        {
          return 
    DateTime.Now.ToString();
        }
      }

      
    #endregion

    Mein Problem ist nun ganz einfach, wenn ich das laufen lasse bekomme ich über die MessageBox folgenden Fehler:
    Der Typ- oder namespacename ScriptElements ist im Namespace Scripting nicht vorhanden. (Fehlt eine Assemblyverweis?).
    Wie bekomme ich das ganze zum laufen?
    Wenn ich ScriptElements durch z.b. float ersetze, zum rechnen, läuft es wunderbar.
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.883
    Blog-Einträge
    34
    Hi

    Du fügst der zur kompilierende Anwendung keine Referenz hinzu, die die Deklaration von ScriptElements enthält. Du müsstest sozusagen diese Anwendung als Referenz mit eintragen.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    lordfritte lordfritte ist offline Mitglied Brokat
    Registriert seit
    Mar 2006
    Beiträge
    256
    Hallo, danke für den Tip, also hier mit geht es jetzt:
    PHP-Code:
    List<stringassemblyNames = new List<string>();
          foreach (
    Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
          {
            if((
    asm.Location != null) && (asm.Location.Length 0))
              
    assemblyNames.Add(new Uri(asm.Location).LocalPath);
          }
          
    compileUnit.ReferencedAssemblies.AddRange(assemblyNames.ToArray()); 
     

  4. #4
    lordfritte lordfritte ist offline Mitglied Brokat
    Registriert seit
    Mar 2006
    Beiträge
    256
    Es läuft aber nicht, ich bekomme immer in der Zeile: "runDelegate = (ScriptRun)Delegate.CreateDelegate(typeof(ScriptRun), objFunc, calculationFunction.Name);" Die Exception:
    [System.ArgumentException] = {"Fehler beim Binden an die Zielmethode."}
    Geändert von lordfritte (05.10.08 um 19:44 Uhr)
     

Ähnliche Themen

  1. 3ds max scripting
    Von holzmcgyver im Forum 3D Studio Max
    Antworten: 0
    Letzter Beitrag: 25.02.10, 11:50
  2. 3ds max scripting
    Von holzmcgyver im Forum 3D Studio Max
    Antworten: 0
    Letzter Beitrag: 25.02.10, 10:37
  3. Problem mit C# Scripting
    Von lordfritte im Forum .NET Application und Service Design
    Antworten: 0
    Letzter Beitrag: 09.02.08, 22:03
  4. InDesign Scripting mit JS
    Von JackyD im Forum Desktop Publishing (DTP)
    Antworten: 2
    Letzter Beitrag: 10.04.05, 09:57
  5. mIRC Scripting...
    Von fUnKuCh3n im Forum Internetkommunikation
    Antworten: 1
    Letzter Beitrag: 26.07.04, 15:00