C # Внешний массив функций - PullRequest
       32

C # Внешний массив функций

0 голосов
/ 22 февраля 2011

Хорошо, так что это снова о моем проекте. У меня есть клиент и сервер. Они взаимодействуют между собой, и пакеты имеют следующую структуру [OP CODE] [LENGTH] [DATA]

Теперь на стороне сервера я хочу загрузить код функции для каждого кода операции из внешнего файла .cs.

Так что при компиляции это будет выглядеть так

- OPCODES
-- OPCODE1.cs
-- OPCODE2.cs
-- OPCODE3.cs
-- OPCODE4.cs
OPCODES.cfg (has list of all op codes and location for function code)
MyProgram.exe

Как бы я сделал что-то подобное?

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

Вы можете создать словарь (при условии, что код операции является целым числом

        Dictionary<int, Action> actions = new Dictionary<int, Action>();
        actions[7] = () => Console.WriteLine("hello World");

для выполнения кода операции "7" вы можете сделать

        actions[7]();

, если вы хотите, чтобы он был более устойчивым:

        Action action;
        if (actions.TryGetValue(7, out action))
            action();
        // else illegal opcode

Если вы хотите загрузить словарь действий из файла, это немного сложнее Вы можете вызвать статический метод ConsoleApplicationTest.Program.MyMethod() через словарь, подобный этому

namespace ConsoleApplicationTest
{
public class Program
{
    public static void MyMethod()
    {
        Console.WriteLine("MyMethod called");
    }
 } 
 }

Диктонар может выглядеть так

        Dictionary<int, MethodInfo> dynamicActions = new Dictionary<int, MethodInfo>();

        dynamicActions[7] = Assembly.GetExecutingAssembly().GetType("ConsoleApplicationTest.Program").GetMethod("MyMethod", BindingFlags.Public | BindingFlags.Static);

и метод будет вызываться так

        MethodInfo method;
        if (dynamicActions.TryGetValue(7, out method))
            method.Invoke(null, new object[0]);
0 голосов
/ 22 февраля 2011

Похоже, вы ищете что-то гораздо более динамичное, чем простое перечисление или словарь действий. Вы упоминаете в своем вопросе, что "OPCODES.cfg (содержит список всех кодов операций и расположение для кода функции)". Означает ли это, что функции кода операции не обязательно будут компилироваться с приложением основного сервера?

Если это так, вы, вероятно, будете рассматривать какую-то архитектуру плагинов, поэтому вы можете добавлять и удалять функции кода операции в любое время. Я бы рекомендовал MEF в качестве хорошей отправной точки.

0 голосов
/ 22 февраля 2011

Вы можете использовать регистр, чтобы сигнализировать о получении какого-либо пакета.

switch(packet.OpCode)
{
   case 1:
   OnHelloPacket();
   break;
   case 2:
   OnInfoPaket();
   break;
   //etc
}
...