Передача типов классов во время выполнения скомпилированного кода 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.