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

Chr*_*ris 1 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
        }
Run Code Online (Sandbox Code Playgroud)

虽然可能有一些语法糖允许我以另一种方式在同一类型的两个属性之间翻转,但我不知道.有任何想法吗?

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

Joh*_*ers 6

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

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