Защищают ли директивы препроцессора код сервера от клиента?
Я занимаюсь разработкой клиент-серверной библиотеки. Некоторые из классов могут использоваться клиентом или сервером, но выполняются по-разному и дают немного разные результаты для каждого. Кроме того, код сервера может содержать дополнительные методы, которые не будут вызываться из клиентской сборки.
Класс может выглядеть так:
public class StuffDoer {
public void DoStuff(object msg)
{
ServerDoStuff(msg);
ClientDoStuff(msg);
}
[Conditional("SERVER")]
private void ServerDoStuff(object msg)
{
// Do secret server stuff...
}
[Conditional("CLIENT")]
private void ClientDoStuff(object msg)
{
// Do client sutff...
}
[Conditional("SERVER")]
public void DoCoolStuff(object msg)
{
// server does cool stuff...
}
}
Я читал, что атрибут Conditional по-прежнему компилирует код и поэтому будет в сборке, в отличие от директив препроцессора, которые полностью удаляют код и даже не компилируют его.
Я обеспокоен тем, что недобросовестный клиент может взломать продукт, не затрагивая исходный код и выясняя, как работает сервер.
Являются ли мои опасения необоснованными или мне нужно разместить директивы препроцессора, чтобы скрыть исходный код?
2 ответа
Если "SERVER" не определен, метод, помеченный как "SERVER", всегда будет компилироваться в окончательную сборку, но все вызовы метода будут удалены.
Согласно документации:
Применение ConditionalAttribute к методу указывает компиляторам, что вызов метода не должен компилироваться в промежуточный язык Microsoft (MSIL), если не определен символ условной компиляции, связанный с ConditionalAttribute.
Когда вы компилируете с определенным CLIENT, код для вызова метода, отмеченного с помощью SERVER, не будет присутствовать в окончательной сборке. Но код для метода будет присутствовать. Вы не можете достичь того, что вам нужно, таким образом.