Ссылка на текущую сборку с помощью 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);