WARNING: Quite a big post, code example below.
Such a server core just can't be done by simply opening up the IDE and making up code that works as you go on, you're missing a great deal of real software engineering, and since you're going for something serious, you have to check your possibilities.
You need to specify an efficient design pattern to use/customize to your needs, or you might even create up your own design pattern.
IMHO for extensibility i'd go with a
Strategy Pattern (aka
Policy based design) design for keeping the core intact and available for later editing by simply changing functional classes in there, which could also be other hosts for other functional classes.
You will not only allow for really fast edits in less time, but by allowing such extensibility in your code also allows for having multiple running modes for the server, ex. 5135 mode for allowing 5135-patched clients or 4267 mode for allowing 4267-patched clients, notice the amazing patch difference yet the same core for both.
As for the language in choice, i'd take C++, C++'s templates allow (IMHO) further more control and extensibility to your classes, plus the types of the classes are determined at compile time so there will be absolutely no impact on the performance vs a core that's not extensible.
C# also allows such functionality, with no significant performance impact.
[
]
LATER EDIT:
Kinda free so I decided to write up a small example of policy-based designs in C#
Code:
public interface IOperation
{
int Operate(int arg1, int arg2);
}
public interface IDisplay
{
void Display(object Arg);
}
public class TestHost<T, C>
where T : IOperation, new()
where C : IDisplay, new()
{
T Oper = new T();
C Disp = new C();
public void Display(object Arg)
{
Disp.Display(Arg);
}
public int Operate(int arg1, int arg2)
{
return Oper.Operate(arg1, arg2);
}
}
public class MultipleOperation : IOperation
{
public int Operate(int arg1, int arg2)
{
return (arg1 * arg2);
}
}
public class ConsoleDisplay : IDisplay
{
public void Display(object Arg)
{
Console.WriteLine(Arg.ToString());
}
}
public static void Main (string[] args)
{
TestHost<MultipleOperation, ConsoleDisplay> THost = new TestHost<MultipleOperation, ConsoleDisplay>();
int result = THost.Operate(2, 6);
THost.Display(result);
#if DEBUG
Console.ReadLine();
#endif
}