Задать вопрос

В сборку не попадают необходимые references. Как исправить?

Добрый день!

Имеется класс:
Класс
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Reflection;

namespace namespace1
{
    public class AClass
    {
        public void Run(string Code)
        {
            // Формируем зависимости
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            ScriptOptions options = ScriptOptions.Default.AddReferences(assemblies);

            // Запускаем скрипт
             var result = CSharpScript.RunAsync(Code, options);
        }
    }
}

Всё просто: получаю сборки текущего домена -> копирую их в настройки скрипта -> выполняю скрипт.
Код, который пытаюсь передать в процедуру Run:
Код
string code = @"using Excel = NetOffice.ExcelApi; "
                   + @"Excel.Application ExcelApp = new Excel.Application(); ";

Как Вы заметили, в передаваемом коде я использую using. Который должен ссылаться на соотв. dll (NetOffice.ExcelApi).
В проекте данная ссылка присутствует:
Свойства
5b07e51a41244cd89cb60fb80a11348e.jpg

К сути:
когда я получаю AppDomain.CurrentDomain.GetAssemblies(), то там соответственно нет сборки NetOffice. Как я понял, это связано с тем, что компилятор умный и не загружает те сборки, которые в коде не используются явно. Всё логично (это подтвердилось, когда я в код метода Run добавил строку:
NetOffice.ExcelApi.Application SomeVar = new NetOffice.ExcelApi.Application();

После, я решил, что буду принудительно подгружать dll в домен. Но выяснил, что при сборке проекта, эта dll не попадает в файлы сборки, хотя на них стоит свойство "Копировать локально".

В связи с этим несколько вопросов:
1) Возможно ли, принудительно заставить сборщик копировать неиспользуемые явно ссылки(dll) в релизную папку.
2) Можно ли, получить получить список всех Assemblies(может просто список имён) в коде, включая те, что не используются явно? (приложение не ASP.NET)

P.S.
В C# совершенный новичок. 100% где-то пока недопонимаю некоторые вещи. Прошу понять и простить :)
Буду благодарен, если посоветуете хорошие источники для прокачки скила в C#.
  • Вопрос задан
  • 344 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
mshak
@mshak
Можно динамически подгружать необходимую сборку.
Для этого надо подписаться на событие
AppDomain.CurrentDomain.AssemblyResolve

и твой код должен будет делать следующее:
Если сборка загружена, возвращать уже загруженную,
Если сборка еще не загружалась, то return Assembly.LoadFrom("путь до файла сборки");
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы