1

コンパイルされたDLLとして他の人がプロジェクトで参照してほしい内部APIがあります。参照されるスタンドアロンプ​​ロジェクトの場合、条件付きコンパイル(#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
        }

同じタイプの2つの属性を別の方法で切り替えることができる構文糖衣があるかもしれませんが、私にはわかりません。何か案は?

別の方法は、アセンブリではなくプロジェクト全体を参照することですが、可能であれば、コンパイルされたDLLを参照するだけにしておきたいと思います。それが必要な場合、私は問題を解決するためのまったく新しいアプローチにも完全にオープンです。

4

3 に答える 3

6

You don't need to do this. Those URLs are not "real" URLs - they do not represent locations on the Internet. They are only used to make names unique.

You should use the same namespace name for dev as for production.

于 2010-05-12T16:38:22.323 に答える
2

重要なのは、#ifステートメントはコンパイル中にのみ実行されるということです。コンパイルされたアセンブリを取得すると、それが持っていたものに固執します。残りのコードはアセンブリから削除されます:)

テスト/本番環境でURLを異なるものにする場合は、から派生する新しい属性を作成し SoapDocumentMethodAttribute、AppSettingの値に応じてこれらの値を設定する必要があります:)

于 2010-05-12T16:39:50.247 に答える
-1

まあ、わかりました-最初に、コンパイル後も条件付きCOMPILEがそのまま残ります。一体どうやってそれがそうではないという考えを得たのですか?条件付きコンパイルです。

リフレクションで修正できる属性 - リフレクションを「オーバーライド」して、そこに独自の情報を返すことができます。トリッキーですが、可能です (リフレクション コードにプロパティを "注入" できるのと同じ方法です)。しかし、私がそれを望んでいるかどうかはわかりません。基本的に...リフレクションからではなく、構成ファイルからサーバーURLのようなものを取得する必要があります。間違ったアプローチだと思います。

于 2010-05-12T16:34:53.440 に答える