C#中的条件编译hackery - 有没有办法解决这个问题?

时间:2010-05-12 16:30:24

标签: c# conditional-compilation

我有一个内部API,我希望其他人在他们的项目中作为编译的DLL引用。当它是一个被引用的独立项目时,我使用条件编译(#if语句)来根据编译符号切换关键Web服务类的行为。问题是,一旦生成了一个程序集,它就会被锁定到最初编译时编译符号的内容 - 例如,如果这个程序集是用DEBUG编译的并且被另一个项目引用,即使另一个项目是作为RELEASE构建,程序集仍然像在DEBUG中一样,因为它不需要重新编译。这是有道理的,只是给出了一些背景知识。

现在我正在尝试解决这个问题,因此我可以通过其他方式切换程序集的行为,例如扫描交换机的app / web配置文件。问题是,我在之间切换的一些程序集代码是方法的属性,例如:

#if PRODUCTION
        [SoapDocumentMethodAttribute("https://prodServer/Service_Test", RequestNamespace = "https://prodServer", ResponseNamespace = "https://prodServer")]
#else
        [SoapDocumentMethodAttribute("https://devServer/Service_Test", RequestNamespace = "https://devServer", ResponseNamespace = "https://devServer")]
#endif
        public string Service_Test()
        {
            // test service
        }

虽然可能有一些语法糖允许我以另一种方式在同一类型的两个属性之间切换,但我不知道。有什么想法吗?

替代方法是引用整个项目而不是程序集,但是如果可以的话,我宁愿坚持引用已编译的DLL。如果需要的话,我也完全可以采用一种全新的方法解决问题。

3 个答案:

答案 0 :(得分:6)

您不需要这样做。这些URL不是“真正的”URL - 它们不代表Internet上的位置。它们仅用于使名称唯一。

您应该为dev使用与生产相同的命名空间名称。

答案 1 :(得分:2)

问题是,#if语句仅在编译期间运行。一旦你有一个编译的程序集 - 它将坚持它所拥有的..其余的代码从程序集中被删除:)

如果您希望测试/制作的URL不同,则应创建一个派生自SoapDocumentMethodAttribute的新属性,并根据AppSetting值设置这些值:)

答案 2 :(得分:-1)

好吧,好吧 - 首先,在编译之后,显然有条件的COMPILE保持不变。你怎么会得到这个想法呢?这是一个有条件的COMPILE。

您可以通过反射修复属性 - 您可以“覆盖”反射以在那里返回您自己的信息。它很棘手,但它是可能的(同样可以“注入”属性到反射代码)。但不确定我是否希望这种情况发生。基本上......你应该得到类似服务器URL的东西,而不是来自反射,而是来自配置文件。我会说错误的做法。