InteractiveAssemblyLoader не работает в консольном приложении

Я пытаюсь использовать Roslyn script API в своем проекте. Я создал тестовое консольное приложение и пытаюсь разрешить ссылки, используя InteractiveAssemblyLoader

Есть код:

var scriptText = @"
    using System;
    using Test.Namespace.From.Referenced.Dll;

    var y = new TestType();
    var x = y.GetStringDescription();

    return x;
";

using (var interactiveLoader = new InteractiveAssemblyLoader())
{
    interactiveLoader.RegisterDependency(typeof(TestType).Assembly);

    var script = CSharpScript.Create<string>(
        scriptText,
        globalsType: typeof(Globals),
        options: ScriptOptions.Default,
        assemblyLoader: interactiveLoader
    );

    script.Compile();

    // exception raised here
    var result = await script.RunAsync(globals);
}

Этот код не удался с исключением

«Тип или имя пространства имен «TEST» не найден (вы пропустили директиву использования или ссылку на сборку?) System.Exception {Microsoft.CodeAnalysis.Scripting.CompilationErrorException}»

Консольное приложение Windows, .NET 4.7.1.

Что я делаю неправильно?


person Alexey Nikiforov    schedule 15.12.2017    source источник


Ответы (1)


Обновлять. Поскольку в комментариях мы выяснили, что вы пытаетесь сослаться на сборку в памяти, попробуйте следующий подход:

byte[] assemblyBytes = DownloadAssembly();
using (var interactiveLoader = new InteractiveAssemblyLoader()) {
    interactiveLoader.RegisterDependency(Assembly.Load(assemblyBytes));
    var script = CSharpScript.Create<string>(
        scriptText,
        globalsType: typeof(Globals),
        options: ScriptOptions.Default.AddReferences(MetadataReference.CreateFromStream(new MemoryStream(assemblyBytes))),
        assemblyLoader: interactiveLoader
    );

    script.Compile();
    var result = await script.RunAsync(globals);
}
person Evk    schedule 15.12.2017
comment
Не так просто. Я пытаюсь разрешить библиотеку в памяти. Так работает система плагинов в моем приложении. Библиотеки с плагинами скачиваются с сервера и загружаются в память. И я пытаюсь добавить ссылку на эту библиотеку в скрипт. Согласно этой статье strathweb.com/2016/03/ должно работать, но не работает. Может я что-то недопонимаю. - person Alexey Nikiforov; 16.12.2017
comment
Итак, у вас есть библиотека в памяти. Почему нельзя добавить его в ссылки (через AddReferences)? Ваша ссылка, кстати, у меня не работает. - person Evk; 16.12.2017
comment
Roslyn нужно прочитать библиотеку с диска для загрузки. Вы не можете добавить ссылку на dll без Location. AddReferences вызовет исключение. - person Alexey Nikiforov; 16.12.2017
comment
@AlexeyNikiforov, пожалуйста, проверьте, помогает ли обновленный ответ в вашей ситуации. - person Evk; 16.12.2017