Ссылка на текущую сборку с помощью CompilerParameters

Сейчас я работаю над проектом, и команда хочет написать код и отредактировать его без перекомпиляции всего проекта, поэтому я решил попробовать и внедрить механизм сценариев.

Реализовав Lua в C++ раньше, я не был новичком в реализации возможностей сценариев в проектах. Однако мы хотели попробовать реализовать прямой C#, используя пространство имен Microsoft.CSharp в сочетании с System.Reflection, который уже встроен в C#.

Поэтому, услышав об этом, я начал изучать документы и нашел прототип, который ПОЧТИ работает, но не совсем.

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

namespace Scripting
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("using System;");
            builder.Append("using Scripting;");
            builder.Append("class MyScript : IScript");
            builder.Append("{");
            builder.Append("    string ScriptName");
            builder.Append("    {");
            builder.Append("        get { return \"My Script\"; }");
            builder.Append("    }");

            builder.Append("    public bool Initialize()");
            builder.Append("    {");
            builder.Append("        Console.WriteLine(\"Hello, World!\");");
            builder.Append("        return true;");
            builder.Append("    }");
            builder.Append("}");

            CSharpCodeProvider provider = new CSharpCodeProvider();
            CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" });
            param.GenerateInMemory = true;
            param.GenerateExecutable = true;
            CompilerResults result = provider.CompileAssemblyFromSource(param, builder.ToString());
            if (result.Errors.Count > 0)
            {
                foreach (CompilerError error in result.Errors)
                    Console.WriteLine(error);
                Console.ReadKey();
                return;
            }
        }
    }
}

Проблема, с которой я столкнулся на данный момент, заключается в том, что я хочу иметь возможность ссылаться на мой интерфейс - IScript.cs (который находится внутри пространства имен Scripting и, следовательно, текущей сборки), - чтобы скрипты, написанные и проанализированные в компиляторе, могли получить к нему доступ. Очевидно, что я добавил Scripting.dll в качестве параметра, но, похоже, он не доступен по тем или иным причинам. Я запускаю его в режиме отладки, так что это может привести к серьезному повреждению лица. Что?

Есть ли способ сослаться на текущую сборку и передать его в CompilerParameters? Или я по-королевски прикручен / стоит ли полагаться на создание сборки для объектов сценария / и т. Д.?

2 ответа

Решение

Это, вероятно, ищет в неправильном каталоге.

Проходить typeof(Program).Assembly.CodeBase пройти полный путь.

Вы можете получить исполняемый файл и передать его в CompilerParameters:

       string exeName = Assembly.GetEntryAssembly().Location;      
       param.ReferencedAssemblies.Add(exeName); 
Другие вопросы по тегам