Laden...

C# Compiler...

Erstellt von norman_timo vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.648 Views
norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 19 Jahren
C# Compiler...

Hallo C#-Welt!

Ich würde gerne in meinem Sourcecode den C# Compiler benutzen, kome aber mit den Parametern nicht zurecht!

Nur zum besseren Verständnis, ich würde gerne folgende Methode benutzen:

Microsoft.CSharp.Compiler.Compile(string[], string[], string, string[], System.Collections.IDictionary);

Nur verwendbar nachdem man die Referenz cscompmgd.dll mit eingebunden hat.

Ich verstehe hier die ersten beiden Parameter nicht, weiß nur eines davon sind die gesamten .cs Quellcodedateien, aber was zum Henker ist das andere mit dem Debug-Zeug?

MSDN sagt mir folgendes:

Compile the given C# sources to the specified target file.

[C#]
public static CompilerError[] Compile(
string[] sourceTexts,
string[] sourceTextNames,
string target,
string[] imports,
IDictionary options
);

Parameters:

sourceTexts:
An array of type string, each with C# code. Each string is the equivalent of a single source file. There must be at least one sourceText element.

sourceTextNames:
An array of type string containing the filenames for each sourceText. The filenames are used for compiler diagnostics and debug information. This array is required, but can be locally overridden by use of the #line directive. This array must have the same number of elements as the sourceTexts parameter.

target:
The output filename. This argument is required.
imports
An array of type string, with files to reference. This is the same as the /reference (Import Metadata) compiler option. This parameter can be a null reference (Nothing in Visual Basic).

options:
A IDictionary of compiler options. The key is the short form of the compiler option. The value is the value desired for the option. This parameter can be a null reference (Nothing in Visual Basic). Note that not all of the C# Compiler Options are recognized. Recognized options and values:
...

Ich bekomm zwar bei Ausführung keine Exception, aber in der Konsolenausgabe steht dann, dass in der 1.Zeile im File des 2. Parameters (hier: sourceTextNames) im Namespace keine Member enthalten sein dürfen???

Kann mir hier jemand helfen?

Bitte nicht mit dem Argument kommen, ich könnte ja den Konsolenkompiler verwenden, denn ich will dass diese Anweisung in meinem Programm mitkompiliert wird. Ansonsten müsste ich bei einer Installation meines Programmes auch den csc mit installieren, und das will ich nicht!

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

1.373 Beiträge seit 2004
vor 19 Jahren

Original von norman_timo
Bitte nicht mit dem Argument kommen, ich könnte ja den Konsolenkompiler verwenden, denn ich will dass diese Anweisung in meinem Programm mitkompiliert wird. Ansonsten müsste ich bei einer Installation meines Programmes auch den csc mit installieren, und das will ich nicht!

Du brauchst csc nicht mitzuliefern, der compiler ist auch beim Framework immer dabei (nicht nur beim SDK).

Aber zum Thema. Du solltest Microsoft.CSharp.Compiler nicht verwendent. In .NET 2 ist er bereits als obsolote ("veraltet") markiert. Statt dessen solltest du lieber den CSharpCodeProvider benutzern und mit CreateCompiler eine ICodeCompiler Instanz für C# erstellen lassen. Das lässt sich auch übersichtlicher bedienen.

Wenn du aber nach wie vor den Microsoft.CSharp.Compiler verwenden willst, kurz eine Erklärung zu den ersten beiden Parametern:
Der erste ist ein Array mit C#-Code-Teilen. Jedes Element im Array repräsentiert eine Codedatei.
Der zweite Parameter weist jeder Codedatei einen Namen zu. Das erste Element im sourceTextName gibt an, wie die Datei heißt, die das erste Element im sourceText-Array beinhaltet usw. Diese Informationen im sourceTextName-Array werden benutzt, um z.B. bei einer Exception sagen zu können, in welcher "Datei" die Ausnahme aufgetreten ist.

Vielleicht mal ein Beispiel


string[] sourceText = {
        // erste Datei, wird später "mysource.cs" genannt
        @"using System; 
            class X { 
                static void Main() { 
                Console.WriteLine(""foo""); 
                } 
            }",
        // erste Datei, wird später "foo.cs" genannt
        @"using System; 
            class Y { 
                public void Foo() {
                }
            }"
};
string[] sourceTextNames = {
        "mysource.cs", // Name des ersten Elements in sourceText
        "foo.cs" // Name des zweiten Elements in sourceText
};

string[] imports = {
    "System.dll"
};

CompilerError[] errors = Compiler.Compile( sourceText, sourceTextNames, "out.dll", imports, null );

foreach ( CompilerError err in errors ) {
    Console.WriteLine( err );
}

Aber wie gesagt, benutzt ICodeCompiler, der ist leichter zu bedienen und die empfohlene Variante (spätestens für .NET 2).

MfG VizOne

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo norman_timo,


using System;
using System.IO;
using Microsoft.CSharp;

abstract class App
{
   public static int Main (string [] astrArg)
   {

      String [] strSrcFiles = new String [1];
      String [] strSrcNames = new String [1];
      String    strOutName;

      strSrcNames [0] = "hello.cs";
      strOutName = "hello.exe";
      StreamReader sr = new StreamReader (strSrcNames [0]);
      strSrcFiles [0] = sr.ReadToEnd ();

      Microsoft.CSharp.Compiler.Compile (strSrcFiles,
                                         strSrcNames,
                                         strOutName,
                                         null,
                                         null);


      return 0;
   }
}

übersetzt bei mir problemlos die Datei hello.cs.

HTH

herbivore

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 19 Jahren

Vielen Dank für die Infos!

Nun, ich habe nicht gewust, dass im ersten Parameter der 'echte' Sourcecode in String Format stehen muss, ich war der Meinung da steht schon das File, das C#-Code enthält.

Dass dieser (Verzeihung🙂 blöde Compiler wirklich als String den Sourcecode haben will, das ist mir nun wirklich nicht in den Sinn gekommen. (Wie umständlich ;.))

Also da das Ganze ja schon als veraltet gilt, schaue ich mir doch den
CSharpCodeProvider
anschauen!

Vielen Dank
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo norman_timo,

Dass dieser (Verzeihungsmile blöde Compiler wirklich als String den Sourcecode haben will, das ist mir nun wirklich nicht in den Sinn gekommen. (Wie umständlich ;.))

hm, das sehe ich genau andersherum. In meinem Beispiel oben steht der Code zwar auch in einer Datei, aber den eigentlichen Einsatzzweck für Compiler.Compile sehe ich darin, automatisch erzeugten Code zu übersetzen. Und dann spart man sich eben irgendwelche temporären Dateien anlegen zu müssen, sondern kann direkt übersetzen. (Sehr komfortabel ;.))

herbivore

norman_timo Themenstarter:in
4.506 Beiträge seit 2004
vor 19 Jahren

Hallo Herbivore!

Ja aber grad bei diesem Microsoft Compiler hab ich das so verstanden, dass durch den 2. Parameter doch eh ein .cs-File angelegt wird, also trotzdem ein temporäres File anlegt, oder nicht?

Dann ist mirs doch lieber, dass ich gleich das File angebe lieber.

Sinnig wäre in Deinem Fall es gewesen, dass man komplett OHNE .cs-File auskommt. Das hat auch seinen Reiz, da würde ich Dir zustimmen, aber so...

Egal gehopst wie gesprungen 😉

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo norman_timo,

nee, da werden keine temporären Dateien angegeben, man kommt also komplett ohne .cs-Dateien aus. Complier.Compile braucht lediglich die Namen, z.B. damit er in Fehlermeldungen darauf Bezug nehmen kann.

herbivore