Laden...

.NET 2.0 Runtime kann zur Laufzeit die .NET 4.0 dll nicht laden

Erstellt von Desert Fox vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.419 Views
D
Desert Fox Themenstarter:in
33 Beiträge seit 2010
vor 12 Jahren
.NET 2.0 Runtime kann zur Laufzeit die .NET 4.0 dll nicht laden

Hallo Community,

Wir haben in der Firma eine kleine scripting engine mit dem CSharp für eines unserer Produkte, die Script Engine ist auf .NET 2.0 Kompiliert

Jetzt habe ich das problem das ich für einen Script die klasse System.ServiceModel.Activities.WorkflowControlClient aus dem .NET Framework 4.0 verwenden will.

Das problem ist jetzt allerdings das die .NET 2.0 Runtime zur laufzeit die .NET 4.0 dll nicht laden kann (3.5 scheinen aber zu funktionieren, was warscheinlich mit änderungen bei 4.0 am GAC und der CLI zu tun hat oder?)

Meine frage ist nun, muss ich eine NET 4.0 Version von meiner Scripting runtime bauen damit ich auch 4.0 Libaries verwenden kann oder gibt es eine andere lösung für das problem?)

Hier mal mein testcode:


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
using System.IO;

namespace CompilerTest
{
    class Program
    {
        public static readonly string Net4Gac = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0");

        static string[] GacDirs = new string[] 
        {
            Net4Gac,
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Reference Assemblies\Microsoft\Framework\v3.5"),
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Reference Assemblies\Microsoft\Framework\v3.0")
        };

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

            Assembly assembly = Compile(
                codeFilePath: @"C:\Daten\Projects\Dropbox\Arbeit\CompilerTest\CompileCode\TestClass.cs",
                referencedAssemblyPaths: new string[] 
                { 
                    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll"),
                    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.ServiceModel.Activities.dll"),
                    Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.ServiceModel.dll")
                });
            assembly.GetType("TestClass").GetMethod("TestMethod").Invoke(null, new object[] { });
        }

        private static Assembly Compile(string codeFilePath, params string[] referencedAssemblyPaths)
        {
            var codeProvider = new CSharpCodeProvider();
            var parameter = new CompilerParameters();
            parameter.GenerateExecutable = false;
            parameter.GenerateInMemory = true;

            foreach (string assemblyPath in referencedAssemblyPaths)
            {
                parameter.ReferencedAssemblies.Add(assemblyPath);
            }
           
            CompilerResults results = codeProvider.CompileAssemblyFromFile(parameter, codeFilePath);
            if (results.Errors.Count != 0)
            {
                throw new Exception(results.Errors[0].ErrorText);
            }

            Assembly assembly = results.CompiledAssembly;
            return assembly;
        }

        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            var assemblyName = new AssemblyName(args.Name);

            if (assemblyName.Name == "System")
            {
                return null;
            }

            return Assembly.LoadFile(Path.Combine(Net4Gac, assemblyName.Name + ".dll"));
            //return Assembly.Load(new AssemblyName(args.Name));
            //return null;

        }
    }
}

Und hier der kompilierte Code:


using System;
using System.ServiceModel.Activities;
using System.ServiceModel;

public static class TestClass
{
    public static void TestMethod()
    {
        Console.WriteLine("Test1");
        WorkflowControlClient controlClient = new WorkflowControlClient(new BasicHttpBinding(), new EndpointAddress("http://localhost:8080"));
        Console.WriteLine("Test2");
        controlClient.Terminate(Guid.NewGuid());
    }
}



6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

das 3.5er Framework verwendet ja auch die 2er Runtime, daher war das kein Problem. Das 4er Framework hat dagegen ne neue Runtime, daher sind 4er Assemblies nicht mit der 2er Runtime ausführbar.

Meine frage ist nun, muss ich eine NET 4.0 Version von meiner Scripting runtime bauen damit ich auch 4.0 Libaries verwenden kann

Wäre wohl die einfachste Möglichkeit.

Baka wa shinanakya naoranai.

Mein XING Profil.