Защищают ли директивы препроцессора код сервера от клиента?

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

Класс может выглядеть так:

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, не будет присутствовать в окончательной сборке. Но код для метода будет присутствовать. Вы не можете достичь того, что вам нужно, таким образом.