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

}

我读过 Conditional 属性仍然编译代码,因此会在构建中,不像预处理器指令会完全删除代码甚至不编译它。

我担心不诚实的客户可能会通过不混淆源代码并弄清楚服务器的工作原理来破解产品。

我的担心是没有根据的,还是我需要放置预处理器指令来隐藏源代码?

4

2 回答 2

1

根据文档

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

当您使用定义的 CLIENT 进行编译时,调用标有 SERVER 的方法的代码将不会出现在最终程序集中。但是该方法的代码将出现。你无法以这种方式实现你所需要的。

于 2017-02-10T21:51:33.507 回答
0

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

这是代码

这是反编译结果

于 2017-02-10T23:15:09.720 回答