C# CodeDom -> Assembly = immer null

lordfritte

Lieutenant
Dabei seit
Juli 2006
Beiträge
831
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?
 

TheCadillacMan

Commander
Dabei seit
Juni 2005
Beiträge
2.356
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.
 

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
831
Ja habs raus genommen, komtm aber trotzdem null, außerdem müsste es dann doch CompilerError's geben..
 

TheCadillacMan

Commander
Dabei seit
Juni 2005
Beiträge
2.356
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.
 

lordfritte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2006
Beiträge
831
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:
Top