C# code (files) zur laufzeit builden



  • Hallo Leute,

    ich habe eine Object Model als C# Code denn ich zur laufzeit compilieren und ausführen möchte (in memory oder als dll)

    Dafür kann ich CodeDom oder Rosyln verwendet, und ich komme ganz gut klar damit. Allerdings finde ich nur Infos darüber wie man einzelne Klassen als code string, compilieren und zur laufzeit ausführen kann.

    Ich habe aber mehrere *.cs Files welche ich als eine library zur Laufzeit kompilieren kann.. aber ich finde dazu nichts?

    Hier ein Ausschnitt auf Roslyn basis :

    var assemblyName = "TestLibrary";
                string sourceCode = File.ReadAllText(_sourceFilePath.FullName);
                var syntaxTree = CSharpSyntaxTree.ParseText(sourceCode);
    
                CSharpCompilation compilation = CSharpCompilation.Create(
                    assemblyName,
                    new[] { syntaxTree },
                    new MetadataReference[]
                    {
                        MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                        MetadataReference.CreateFromFile(typeof(ElementBase).Assembly.Location)
                    },
                    new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
    
                using (var memoryStream = new MemoryStream())
                {
                    EmitResult result = compilation.Emit(memoryStream);
    
                    if (result.Success)
                    {
                        memoryStream.Seek(0, SeekOrigin.Begin);
                        Assembly assembly = Assembly.Load(memoryStream.ToArray());
                        Type testClassType = assembly.GetType(TypeName);
    
                        var myInstance = Activator.CreateInstance(testClassType,
                            (ContainerBase) null,
                            (IConfigContainerModel) configModel ?? this) as ElementBase;
    
                        // var addResult = (int) testClassType.GetMethod("Add").Invoke(null, new object[] {3, 4});
                        // Console.WriteLine(addResult);
    
                        return myInstance;
                    }
                }
    

    nun will ich aber dass nicht nur eine Source File sondere mehrere in eine assemlby verpacken (zur laufzeit) .. jemand ne idee?

    Vielen Dank schonmal

    EDIT: hmm .. immer wenn ich ein Beitrag verfassen kommen mir Ideen 🙂 vll. muss ich hier

    new[] { syntaxTree },
    

    mhere syntaxtress unterschiedlicher files mitgeben!?🤓



  • Jepp das wars, trozdem Danke. Sorry für den voreiligen Thread 🙂 könn ihr gern wieder schließen..


Log in to reply