Добавить пользовательский класс во время выполнения, ссылка отсутствует
Я пытаюсь сгенерировать код во время выполнения, который использует пользовательский класс из другого пространства имен.
Вот мой код:
namespace Test.Programm.Network
{
class Handler
{
public void CreateAssembly()
{
string[] code =
{
@"using System;
using System.Collections;
namespace Test.Programm.Network
{
class HandleMessage
{
protected static internal Queue _queue;
public static void Received(string message)
{
lock (_queue)
{
_queue.Enqueue(message);
}
}
public HandleMessage()
{
_queue = new Queue();
}
}
}"
};
CompilerParameters parms = new CompilerParameters();
parms.GenerateExecutable = false;
parms.GenerateInMemory = true;
CodeDomProvider compiler = null;
compiler = CodeDomProvider.CreateProvider("CSharp");
CompilerResults compilerResults = compiler.CompileAssemblyFromSource(parms, code);
var cls = compilerResults.CompiledAssembly.GetType("Test.Programm.Network.HandleMessage");
Assembly assembly = compilerResults.CompiledAssembly;
var newHandler = assembly.CreateInstance(compilerResults.CompiledAssembly.GetType("Test.Programm.Network.HandleMessage").ToString());
}
}
}
Но я не хочу передавать строку в мою функцию, я хочу передать собственный тип этой функции.
Теперь у меня есть простой класс сообщений:
namespace Test.Programm.Messages
{
public class Message<T>
{
string _message;
}
}
если я тоже хочу добавить с помощью Test.Programm.Messages в код, который я хочу сгенерировать, я получаю сообщение об ошибке, что это пространство имен не существует, отсутствует ссылка...
Я пытался добавить parms.ReferencedAssemblies.Add("Grid.Node.Messages"); генерации кода, но это не работает. поиск в Интернете и ТАК еще не дал ответа -.-
Спасибо за вашу помощь.
1 ответ
Вы должны ссылаться на сборку вместо пространства имен. Что-то вроде этого:
parms.ReferencedAssemblies.Add("path_to.dll");
куда path_to.dll
путь к файлу сборки, содержащий тип Message<T>
,