1

背景:

Windows サービスと、システム設定の構成とサービスとの通信に使用されるインターフェイスを含む C# Windows フォーム アプリケーションがあります。

望ましい結果:

ソリューションの 2 つのバージョンを構築したいと考えています。Windows サービスに関連するすべてのコードとフォーム要素を含むクライアントバージョンと、すべてを含むサーバーバージョンです。

フォームにはタブ付きコントロールが含まれており、1 つのタブには、ソケットを使用して Windows サービスとのインターフェイスに使用される要素が含まれています。私が実際に達成しようとしているのは、完全なビルドではサービス関連の要素を含むタブがコンパイルされ、条件付きビルドでは同じタブが除外されることだけです。

問題:

この段階で、Windows サービス関連のコードに #if ディレクティブを使用しました。例えば:

#if SERVERBUILD
     //Code relating to Windows service that I do not want to compile 
     //for a client version.
#endif

上記の例では、「SERVERBUILD」は、構成マネージャーを介して選択できるビルド構成に対応しています (標準の「リリース」ビルド オプションとは対照的です)。

私が抱えている問題は、この #if ディレクティブをラップする必要があったコードの一部が、WinForm.Designer.cs ファイルの「Windows フォーム デザイナーによって生成されたコード」というタイトルの領域にあることです。

発生しているように見えるのは、フォーム プロパティの一部を変更すると、このコード領域全体が削除されて再生成され、追加した #if セクションが削除されたように見えることです。

  • 私はこれを正しい方法で行っていますか?
  • WinForm.Designer.cs コードで行った変更が失われる状況を回避する方法はありますか?

条件付きコンパイルなどの経験のある方からのアドバイスをいただければ幸いです。

4

3 に答える 3

2
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent() {

言っ途切れる。コードをフォーム コンストラクターに配置して、問題を解決します。

    public Form1() {
        InitializeComponent();
#if !SERVERBUILD
        panel1.Visible = false;
#endif
    }

パネルを使用すると、その上にあるすべてのコントロールを非表示にする簡単な方法であることに注意してください。

于 2011-03-14T23:30:04.233 に答える
2

#if アプローチの問題は、さまざまなコンパイルに対して複数の #if ステートメントが存在する状況に急速に陥り始める可能性があることです。コードのどのチャンクがどのプロジェクトに関連しているかをすぐに判断するのが難しくなります。

より良い解決策は、すべての一般的なコードを特定し、それらを common/ などの別のプロジェクト フォルダーに保持することです。次に、たとえば server/ の下に特定のサービス コードがあり、 client/ の下にすべてのフォーム コードがあります。

一般的なコードはすべて 1 つの場所に存在し、サーバーとクライアントはより読みやすくなります。サーバーに影響を与えるクライアントのみの変更やその逆について心配する必要はもうありません。さらに、フォルダーを適切に編成することで、プロジェクトの内容 (クライアント/サーバーなどの抽象的な概念) を方法 (フォームなどの具体的な実装) から切り離すことができます。

于 2011-03-14T23:14:16.903 に答える
1

あなたができることはあまりありません。フォーム デザイナーはそのコードを生成し、ユーザーのニーズや行った変更をまったく気にせずに、強引な方法でそれを実行します。このため、自動生成されたコードをいじるべきではありません。

新しいアプローチを取り、自動生成コードを変更せずに必要なことを達成する方法を見つける必要があります。これは間違いなく純粋なフラストレーションの道です。

于 2011-03-14T23:10:37.780 に答える