19

ユーザー認証については、ユーザーごとに特定のモジュールのみを含めたいと考えています。だから私はこのように条件付きコンパイルを設定しました

<DefineConstants>TRACE;DEBUG;SAMPLECONSTANT1</DefineConstants>

プロジェクトファイルを次のように編集しました。

<ProjectReference Include="..\Solution1.Modules.Module1\Solution1.Modules.Module1.csproj" Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
  <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
  <Name>Solution1.Modules.Module1</Name>
</ProjectReference>

この場合、含まれているModule1場合はプロジェクトへの参照を追加したい; しかし、何を入れても、ソリューションは常にプロジェクトをロードします。ここで何が間違っていましたか? DefineConstantsSAMPLECONSTANT1DefineConstantsModule1

更新:実際、私のコードは正しいです。J0e3gan の回答をご覧ください。ReferencesVisual Studio UI は、プロジェクトのフォルダー内の条件付き参照を反映しません。したがって、すべての参照は、任意の構成またはプラットフォームの選択で表示されます。一方、コンパイラと IntelliSense は条件付き参照を認識しており、ビルド中の視覚的なフィードバックとエラー通知の両方で正しい設定を尊重します。

4

3 に答える 3

28

問題は、ソリューションに含めるかどうかではなく、へのプロジェクト参照を調整していることだと思います。Module1 Module1

プロジェクトをソリューションに含める (したがって、ソリューションと共に読み込む) ことと、プロジェクトがソリューション内の別のプロジェクトを参照することは、もちろん 2 つの異なることです。

アップデート:

本当にプロジェクトリファレンスを調整したい場合は、Joe Wrobel が参考になる関連ブログ投稿を書いています。重要なポイントは、 to 条件ItemGroupを含むを要素にラップすることです。たとえば、次のようになります。ProjectReferenceChoose

<Choose>
  <When Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
    <ItemGroup>
      <ProjectReference Include="..\Solution1.Modules.Module1\Solution1.Modules.Module1.csproj">
        <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
        <Name>Solution1.Modules.Module1</Name>
      </ProjectReference>
      <!-- other ProjectReference elements -->
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <!-- other ProjectReference elements -->
    </ItemGroup>
  </Otherwise>
</Choose>

今晩の私のテストから、これは定数のようなものSAMPLECONSTANT1が定義されているかどうかについてプロジェクト参照を調整するのにうまく機能します。ただし、条件付けされたプロジェクト参照は、条件付け定数が定義されているかどうかに関係なく、ソリューション エクスプローラーの参照元プロジェクトの [参照] フォルダーの下に表示されないことに注意してください。

条件付けが機能していることを確認するには、次SAMPLECONSTANT1ビルドする必要がありましModule1。定義されていないSAMPLECONSTANT1場合、で定義されたクラスを解決できなかったため、参照プロジェクトはビルドに失敗しました-これも予想どおりです。Module1

于 2013-05-15T04:46:47.203 に答える