C# CodeDom -> Assembly = immer null

lordfritte

Lieutenant
Registriert
Juli 2006
Beiträge
964
Hallo ich habe ein Problem, ich möchte mir CodeDom ein kleines bisschen Code zur Laufzeit Compilieren
PHP:
private ICompiler Compile()
{
    StringBuilder source = new StringBuilder();
    CompilerParameters parameters = new CompilerParameters();

    parameters.GenerateInMemory = true;

    foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        if ((asm.Location != null) && (asm.Location.Length > 0))
            parameters.ReferencedAssemblies.Add(new Uri(asm.Location).LocalPath);
    }

    source.AppendLine("using System;");
    source.AppendLine("using Core;");

    source.AppendLine("namespace CSharpCompiler {");
    source.AppendLine("public class Compiler : ICompiler {");

    source.AppendLine("public Compiler() { }");
    source.AppendLine("public override object Parse(string sInput) {");

    source.AppendLine("return sInput;");

    source.AppendLine("}}}");

    CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
    CompilerResults compilerResults = provider.CompileAssemblyFromSource(parameters, source.ToString());

    if ((compilerResults != null) && (compilerResults.Errors.Count > 0))
    {
        foreach (CompilerError error in compilerResults.Errors)
            MessageBox.Show(error.ToString());
    }
    else
    {
        Assembly ass = compilerResults.CompiledAssembly;
        object o = ass.CreateInstance("CSharpCompiler.Compiler");
        return (ICompiler)o;
    }

    return null;
}

Aber am ende bei "object o = ass.CreateInstance("CSharpCompiler.Compiler");" kommt immer null.. aber warum?? Wo ist der Fehler?
 
Wenn Assembly.CreateInstance null liefert heißt das, dass der angegebene Typ nicht gefunden werden kann.
Das Problem liegt hier wahrscheinlich in deinem zu compilierenden Code.
Du schreibst:
Code:
source.AppendLine("public override object Parse(string sInput) {");
Das ist syntaktisch falsch, da die Methode "Parse" vermutlich aus dem Interface "ICompiler" stammt und du aber dafür "override" benutzt. Interface Methoden kann man nur implementieren, nicht überschreiben. Nimm mal das "override" raus und probiers nochmal.
 
Ja habs raus genommen, komtm aber trotzdem null, außerdem müsste es dann doch CompilerError's geben..
 
Komisch, dass es keinen CompilerError gibt. In Visual Studio kann man den Code nämlich nicht compilieren.

Du könntest dir mal mit
Code:
Assembly assembly = compilerResults.CompiledAssembly;
foreach(Type type in assembly.GetTypes())
{
    Console.WriteLine(type.FullName);
}
alle Types im Assembly ausgeben lassen und überprüfen ob der Typ "CSharpCompiler.Compiler" auch enthalten ist.
 
Ah es gibt eine eine Exception: "Mindestens ein Typ in der Assembly kann nicht geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen benötigen." ich schau mal nach.

EDIT: Ah er kann eine DLL nicht finden...
 
Zuletzt bearbeitet:
Zurück
Oben