预处理器指令是否保护客户端的服务器代码?

时间:2017-02-10 21:46:30

标签: c# security conditional-compilation preprocessor-directive conditional-attribute

我正在开发一个客户端 - 服务器库。某些类可以由客户端或服务器使用,但执行方式不同,每个类的结果略有不同。同样,服务器代码可能包含不会从客户端构建调用的其他方法。

课程可能如下所示:

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 个答案:

答案 0 :(得分:2)

根据documentation

  

将ConditionalAttribute应用于方法指示编译器   不应将对该方法的调用编译到Microsoft中   中间语言(MSIL),除非条件编译符号   与ConditionalAttribute相关联的定义。

使用CLIENT定义编译时,调用标记为SERVER的方法的代码将不会出现在最终程序集中。但是该方法的代码将存在。你不可能以这种方式达到你所需要的。

答案 1 :(得分:1)

当未定义“SERVER”时,标记为“SERVER”的方法将始终编译为最终程序集,但将删除对该方法的所有调用。

This is code

This is decompiled result