Передача типов классов во время выполнения скомпилированного кода C#

Я пытаюсь прочитать и скомпилировать внешний файл (сейчас это строковая константа)

Я могу использовать базовые примитивы во внешнем коде, но не могу понять, как передать ему тип класса, чтобы он не разозлился - вот что у меня есть (исключая использование строк)

class myClass
{
    public int x;
    public myClass(int n)
    {
        x = n;
    }
}
class Program
{
    static void Main(string[] args)
    {
        string source =
        @"
           namespace ConsoleApplication1
           {
               public class Bar
               {
                   public int getNumber(myClass c)
                   {
                       return c.x;
                   }
              }
          }";     
            Dictionary<string, string> providerOptions = new Dictionary<string, string>
            {
                {"CompilerVersion", "v3.5"}
            };
            CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
            CompilerParameters compilerParams = new CompilerParameters
            {
                GenerateInMemory = true,
                GenerateExecutable = false
            };
            CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
            if (results.Errors.Count != 0)
                throw new Exception("Failed");
        object o = results.CompiledAssembly.CreateInstance("ConsoleApplication1.Bar");
        MethodInfo mi = o.GetType().GetMethod("getNumber");
        object[] param = new object[1];
        myClass c = new myClass(5);
        param[0] = c;
        int myInt = (int)mi.Invoke(o, param);
        Console.Write(myInt);
        Console.ReadLine();
    }
}

Помощь будет оценена

1 ответ

Когда я посмотрел на ваш код, оказалось, что проблема в том, что ваша "новая" сборка (строковая версия) не знает о текущей выполняющейся сборке (то же пространство имен или нет). Решение состоит в том, чтобы сослаться на текущую сборку. Добавьте эту строку сразу после инициализации compilerParams:

compilerParams.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);

Кроме того, когда я запустил ваш код, я изменил объявление myClass на public.

Другие вопросы по тегам