С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
 Аватар для Справлюсь
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357

Ошибка при использовании функции CompileAssemblyFromSource: Исключение при работе с динамической компиляцией

19.09.2020, 21:37. Показов 7759. Ответов 7

Студворк — интернет-сервис помощи студентам
Код программы я взял в теме: Динамическое создание кода, макроподстановка как FoxPro

Мой код программы:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.CodeDom.Compiler;
 
namespace Dynamic_Compilation
{
    class Program
    {
        delegate double Execute(int[] arr, int i);
 
        static readonly string source =
            @"using System;
 
            static class Code
            {
                public static double Execute(int[] arr, int i)
                {
                    return {source};
                }
            }";
 
        static void Main(string[] args)
        {
            string text = Console.ReadLine();
 
            var src = source.Replace("{source}", text);
 
            var compiler = CodeDomProvider.CreateProvider("C#");
            var result = compiler.CompileAssemblyFromSource(new CompilerParameters(), src);
            if (result.Errors.Count == 0)
            {
                var assembly = result.CompiledAssembly;
                var type = assembly.GetType("Code");
                var method = type.GetMethod("Execute");
 
                Execute execute = (Execute)Delegate.CreateDelegate(typeof(Execute), method);
 
                // Цикл со сложными вычислениями
                int[] array = new int[12];
                for (int i = 0; i < array.Length; i++)
                {
                    array[i] = i;
                    Console.WriteLine(execute(array, i).ToString());
                }
            }
        }
    }
}

Вроде как сделал всё "по инструкции"... Однако выскакивает исключение:

Code
1
2
3
4
5
6
Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
   at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
   at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
   at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
   at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources)
   at Dynamic_Compilation.Program.Main(String[] args) in C:\Users\chere\source\repos\LearningCSharp\Dynamic Compilation\Program.cs:line 28
Что я сделал не так?

Добавлено через 3 часа 1 минуту
Элд Хасп, Toros1992, никто не знает из-за чего такое бывает?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2020, 21:37
Ответы с готовыми решениями:

Ошибка при использовании ADODB.CONNECTION при работе с dbf-файлом
Добрый день! Написала макрос с использованием adodb.connection. макрос удаляет строки из файла dbf. На моем компьютере работает, поставила...

Ошибка при работе с ComboBox при использовании FindComponent
Есть комбобокс, список в него загружается из стринггрида. Потом по выбранному значению в комбобоксе лабелю присваивается соответствующее...

Ошибка в коде при работе с динамической памятью
Не могу понят что не так ? При вводе в динамический массив А последовательность &quot;61 3 2 0 -2 -25 -61 -70&quot; программа крашится...

7
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,040
Записей в блоге: 2
20.09.2020, 01:01
Цитата Сообщение от Справлюсь Посмотреть сообщение
Элд Хасп, Toros1992, никто не знает из-за чего такое бывает?
Я никогда не пробовал динамической компиляции.
Наверное, лучше поинтересоваться у автора кода kolorotur.

Цитата Сообщение от Справлюсь Посмотреть сообщение
Что я сделал не так?
Возможно, неверное значение text = Console.ReadLine();

Вставьте вывод и выложите что он покажет:
C#
23
24
25
26
            string text = Console.ReadLine();
 
            var src = source.Replace("{source}", text);
            Console.WriteLine(src); // Что здесь на консоли?
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
20.09.2020, 01:38
Не поддерживается на .NET Core. Используйте Roslyn и его API.
1
 Аватар для Справлюсь
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
20.09.2020, 08:48  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Не поддерживается на .NET Core. Используйте Roslyn и его API
Подключил Roslyn. Мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            var compilation = CSharpCompilation.Create("MyNewDLL")
                .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
                .AddReferences(
                    MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location))
                .AddSyntaxTrees(CSharpSyntaxTree.ParseText(
                    @"
                        using System;
 
                        public static class C
                        {
                            public static void M()
                            {
                                Console.WriteLine(""Hello Roslyn."");
                            }
                        }
                    "));
 
            var fileName = "MyNewDLL.dll";
 
            compilation.Emit(fileName);
 
            var MyNewDLL = AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.GetFullPath(fileName));
 
            MyNewDLL.GetType("C").GetMethod("M").Invoke(null, null);
Агрится на строчку:
C#
1
var MyNewDLL = AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.GetFullPath(fileName));
Code
1
Unhandled exception. System.BadImageFormatException: Could not load file or assembly '.../MyNewDLL.dll'. Format of the executable (.exe) or library (.dll) is invalid.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
20.09.2020, 08:58
Лучший ответ Сообщение было отмечено Справлюсь как решение

Решение

А у вас компиляция точно успешно завершается? Потому что у меня метод возвращает неудачно и ошибку
(8,33): error CS0103: The name 'Console' does not exist in the current context
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
            string[] trustedAssembliesPaths = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator);
 
            List<PortableExecutableReference> references = new List<PortableExecutableReference>();
 
            foreach (var refAsm in trustedAssembliesPaths)
            {
                references.Add(MetadataReference.CreateFromFile(refAsm));
            }
 
            var compilation = CSharpCompilation.Create("a")
                .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
                .AddReferences(references)
                .AddSyntaxTrees(CSharpSyntaxTree.ParseText(
                    @"
                        using System;
 
                        public static class C
                        {
                            public static void M(ff)
                            {
                                Console.WriteLine(""Hello Roslyn."");
                            }
                        }
                    "));
 
            var fileName = "MyNewDLL.dll";
 
            var result = compilation.Emit(fileName);
 
            if (!result.Success)
            {
                foreach (var diag in result.Diagnostics)
                    Console.WriteLine(diag);
                return;
            }
 
            var MyNewDLL = AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.GetFullPath(fileName));
 
            MyNewDLL.GetType("C").GetMethod("M").Invoke(null, null);
 
            Console.ReadLine();
1
 Аватар для Справлюсь
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
20.09.2020, 09:10  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
string[] trustedAssembliesPaths = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator);
 
List<PortableExecutableReference> references = new List<PortableExecutableReference>();
 
foreach (var refAsm in trustedAssembliesPaths)
{
     references.Add(MetadataReference.CreateFromFile(refAsm));
}
А, понял, нужно было внешние зависимости подключить...

Спасибо)

В этом коде мы берём внешние зависимости текущего исполняемого кода и прикрепляем их к компилируемому коду. Правильно?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
20.09.2020, 09:32
Лучший ответ Сообщение было отмечено Справлюсь как решение

Решение

Цитата Сообщение от Справлюсь Посмотреть сообщение
В этом коде мы берём внешние зависимости текущего исполняемого кода и прикрепляем их к компилируемому коду. Правильно?
Типа того. Для компиляции под .NET Framework это не работает, там нужно использовать что-то типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            string programFilesPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
            string netFWRefPath = Path.Combine(programFilesPath, "Reference Assemblies", "Microsoft", "Framework", ".NETFramework", "v4.8");
            var refAssemblies = Directory.GetFiles(netFWRefPath, "*.dll");
 
            List<PortableExecutableReference> references = new List<PortableExecutableReference>();
 
            HashSet<string> excludedAssemblies = new HashSet<string>
            {
                "System.EnterpriseServices.Wrapper.dll",
                "System.EnterpriseServices.Thunk.dll"
            };
 
            foreach (var refAsm in refAssemblies)
            {
                if (!excludedAssemblies.Contains(Path.GetFileName(refAsm)))
                    references.Add(MetadataReference.CreateFromFile(refAsm));
            }
2
 Аватар для Справлюсь
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
20.09.2020, 15:38  [ТС]
Тут, кстати, есть возможность делать одной из внешних зависимостей код текущей сборки. Тогда можно передавать аргументами методов объекты своей сборки.

Для этого нужно после цикла добавления зависимостей вставить:
C#
1
references.Add(MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().Location));
Пример кода:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Loader;
 
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis;
using System.Collections.Generic;
 
namespace Dynamic_Compilation
{
    public class Person {
        public string Name;
        public int Age;
 
        public Person(string name, int age)
        {
            Name = name; Age = age;
        }
    }
 
    class Program
    {
       
        static void Main(string[] args)
        {
            /* Begin Only for .NET Core */ 
 
            string[] trustedAssembliesPaths = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator);
 
            List<MetadataReference> references = new List<MetadataReference>();
 
            foreach (var refAsm in trustedAssembliesPaths)
            {
                references.Add(MetadataReference.CreateFromFile(refAsm));
            }
 
            references.Add(MetadataReference.CreateFromFile(Assembly.GetExecutingAssembly().Location));
 
            /* End Only for .NET Framework */
 
            var compilation = CSharpCompilation.Create("MyNewDLL")
                .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
                .AddReferences(references)
                .AddSyntaxTrees(CSharpSyntaxTree.ParseText(
                    @"
                        using System;
 
                        public static class DynamicCompiledClass
                        {
                            public static void DynamicCompiledMethod(Dynamic_Compilation.Person p)
                            {
                                Console.WriteLine($""Hello {p.Name}! You are {p.Age} years old"");
                            }
                        }
                    "));
 
            var fileName = "MyNewDLL.dll";
 
            var result = compilation.Emit(fileName);
 
            if (!result.Success)
            {
                foreach (var diag in result.Diagnostics)
                    Console.WriteLine(diag);
                return;
            }
 
            var MyNewDLL = AssemblyLoadContext.Default.LoadFromAssemblyPath(Path.GetFullPath(fileName));
 
            MyNewDLL
                .GetType("DynamicCompiledClass").GetMethod("DynamicCompiledMethod")
                .Invoke(null, new object[] { new Person("Ivan", 25) });
 
            Console.ReadLine();
        }
    }
}


Может, кому ещё пригодится)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.09.2020, 15:38
Помогаю со студенческими работами здесь

Исключение при работе с pictureBox (задание картинки при работе с формой)
Хочу задать изображение в компоненте pictureBox во время разработки формы, чтоб при запуске проги сразу отображалась картинка. Задаю...

Ошибка при работе с динамической памятью - 'Invalid pointer operatoion'
Столкнулся с такой проблемой - код исполняется правильно, но при закрытие программы вываливается ошибка(скрин прилогается). Я нашёл...

Создайте исключение, которое сработает при использовании несуществующей функции. Все равно выдает ошибки
def func(x,y): return x+y x= int(input(&quot;Введите переменную x &quot;)) y= int(input(&quot;Введите переменную y &quot;)) try: print(fun)) ...

При использовании функции log (x) при компиляции выводится ошибка "unknown identifier"
Добрый день, при использовании функции log(x) при компиляции выводится ошибка &quot;unknown identifier&quot;. Разве эта функция не...

Ошибка при использовании функции
Добрый день Есть ф-ция: function ABM(f, t0, y0, a, b) e = 0.01 .* f(b, y0); h = 4 .* e; ArrT = ; ArrY =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru