2013-05-28 2 views
0

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

Here's мой код:

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 в коде я хочу, чтобы генерировать, получать ошибки i'm, что это пространство имен Безразлично Нет, отсутствует ссылка ...

Я попытался добавить parms.ReferencedAssemblies.Add («Grid.Node.Messages»); к генерации кода, но это не работает. поиск в Интернете и SO еще не получил ответа. -0-

Спасибо за помощь.

ответ

0

Вы должны ссылаться на сборку вместо пространства имен. Что-то вроде этого:

parms.ReferencedAssemblies.Add("path_to.dll"); 

Где path_to.dll это путь к файлу сборки, содержащий тип Message<T>.

+0

god damm ^^ пробовал все, но не простейшую душу. thx bro – gangfish

Смежные вопросы