0

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

Класс может выглядеть следующим образом:

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... 
    } 

} 

Я прочитал, что условный атрибут еще компилирует код и, следовательно, будет в сборке, в отличие от директив препроцессора, которые бы полностью удалить код и даже не компилировать его.

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

Являются ли мои опасения необоснованными или мне нужно будет размещать предпроцессорные директивы, чтобы скрыть исходный код?

+1

директивы Если бы мне пришлось выбирать между ними, мой выбор будет предварительно процессор. 'ConditionalAttribute' не будет скрывать« внутренности »вашего класса, потому что код сервера будет по-прежнему компилироваться в MSIL (только вызовы методов будут удалены). Кроме того, 'ConditionalAttribute' довольно ограничен относительно того, где и как его можно применить: только методы и классы возвращаемого значения, полученные из' Attribute' – InBetween

ответ

1

Когда «СЕРВЕР» не определен, метод должен быть отмечен как «СЕРВЕР», всегда будет компилироваться в окончательную сборку, но все вызовы метода будут удалены.

This is code

This is decompiled result

2

Согласно documentation:

Применение ConditionalAttribute к способу указывает компиляторов, вызов метода не должны быть скомпилированы в Microsoft промежуточный язык (MSIL), если условный символ компиляции , что не является связанный с ConditionalAttribute.

При компиляции с установленным CLIENT код для вызова метода, помеченного SERVER, не будет присутствовать в окончательной сборке. Но код метода будет присутствовать. Вы не можете достичь того, что вам нужно.

+0

Я не уверен, что это то, что он говорит. В нем говорится, что любой * вызов * методу, отмеченному условным атрибутом, не будет скомпилирован, но сам метод будет, что и пытается избежать. – InBetween

+0

@InBetween вы правы, я отредактировал ответ – Damian