Добавить пользовательский класс во время выполнения, ссылка отсутствует

Я пытаюсь сгенерировать код во время выполнения, который использует пользовательский класс из другого пространства имен.

Вот мой код:

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>,

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