Добавление using в динамическую компиляцию

262
04 мая 2017, 11:22

Всем доброго времени. Изучая динамическую компиляцию наткнулся на проблему - при добавлении некоторых using в текст кода компилируемой программы, данный код не компилируется, даже если сами классы из новых using не используются. Пример кода который призван компилировать новую программу :

using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using Microsoft.CSharp;
using System.Net.Mail;   // intellisense считает ненужной
//-----//
Dictionary<string, string> providerOptions = new Dictionary<string, string>
    {
        {"CompilerVersion", "v3.5"}
    };
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
CompilerParameters compilerParams = new CompilerParameters
{ OutputAssembly = "D:\\Proga.EXE", GenerateExecutable = true };
compilerParams.ReferencedAssemblies.Add("System.Net.Mail");
CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);

вот строка с кодом который компилируется нормально :

string source =
@" 
using System;
namespace PR
{
    public class Prog
    {
        static void Main(string[] args)
        {
            Send.SayHello();
        }
    }
    public class Send
    {
        public static void SayHello()
        {
        }
    }
}

Но если мы совсем незначительно изменим программу, например добавим

using System.Net.Mail;

компилятор работать не будет выдав ошибку : Не удалось найти файл метаданных "System.Net.Mail; "

Вопрос : чего не хватает в исходном коде что бы компилировать проект с using'ами кроме System и содержащий классы из них? И второй вопрос : как подключать DLL из WinApi в программу что бы и они компилировались в новом исполняемом файле ?

[DllImport("mydll.dll")]
Answer 1

Вам надо добавить ссылку на сборку, чтобы ее классы были доступны в коде.

Если вы компилируете код через CodeDOM - то ссылки используемые им сборки задаются через CompilerParameters.ReferencedAssemblies

READ ALSO
Как перерисовывать DataGridView после запроса LINQ

Как перерисовывать DataGridView после запроса LINQ

Есть DGV,в которую считывается таблица из бд(с помощью класса linq2sql)Визуально это выглядит вот так:

277
Проблема с кодировкой UTF-8 через WebSocket

Проблема с кодировкой UTF-8 через WebSocket

Создал ASPNET Core чат на WebSocket'ах

377
Не открывается новое окно

Не открывается новое окно

Если значения параметров нулевые - запускается окно настроек, где должен их ввести (сохранения настроек проихводится в SettingsViewModel)Проблема:...

227
c# Подгрузка dll

c# Подгрузка dll

Добрый день, возникла такая проблема: Я использую dll в проекте C#Но когда я пытаюсь запустить exe, он не запускается ( участок кода, который использует...

221