2013-05-15 16 views
10

ユーザーの承認のために、ユーザーごとに特定のモジュールのみを含める必要があります。だから私はこの定数に基づくVisual Studioの条件付きプロジェクトの参照

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

などの条件付きコンパイルを構成し、このようなプロジェクトファイルを編集した:私はDefineConstantsSAMPLECONSTANT1が含まれている場合Module1をプロジェクトへの参照を追加したい。このケースでは

<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> 

を。 DefineConstantsに何を置いても、ソリューションは常にModule1プロジェクトを読み込みます。私はここで何が間違っていたのですか?

更新:実際には私のコードは正しいです。 J0e3ganの答えを見てください。 Visual Studio UIは、プロジェクトのReferencesフォルダ内の条件付き参照を反映しません。したがって、すべての参照は、任意の構成またはプラットフォームの選択で表示されます。一方、コンパイラとIntelliSenseは条件付き参照を認識しており、ビジュアルフィードバックとビルド時のエラー通知の両方で正しい設定を尊重します。私は問題があると思われる

+1

詳細を教えてください。 –

+0

こんにちはCuong Le、私はちょうど私の質問を更新します。DefineConstantsには、DefineConstants、ソリューションに入れたものは何でも、プロジェクトModule1への参照を追加します。いつもモジュール1のプロジェクトをロードしてください –

+1

私はあなたが時間をコンパイルするのではなく、実行時にモジュールをロードする方が良いでしょう。リフレクションやMEFを使ってこれを行うことができます。 –

答えて

17

は、溶液中のModule1を含めるかどうか、あなたはコンディショニングプロジェクト参照Module1にあるということです。

解決策にプロジェクトを含める(したがってソリューションをロードする)プロジェクトと、ソリューション内の別のプロジェクトを参照するプロジェクトは、もちろん2つの異なることがあります。

UPDATE:

あなたが本当にプロジェクト参照を調整したい場合は、ジョーWrobelは役立つはずa related blog postを書きました。キーお持ち帰りはChoose要素で調整するようにProjectReferenceが含まれていItemGroupラップすることです - 例えば:私のテストから

<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で定義されたクラスを解決できなかったためです。

+2

プロジェクトではなくDLLを参照すると、次のようにうまくいきます。 ' 'したがってなぜProjectReferenceが機能しないのか分かりません。 –

+3

あなたの答えは正しい、私はテストし、それは働いた、私はプロジェクトのReferencesフォルダにチェックして、まだプロジェクトを参照してください、それは私のコードがうまくいかないと思う理由です。これに興味がある人は、自分のコードを使うこともできます。 'Choose'タグや' When'タグを使わなければ簡単です:) –

+0

@chinhnguyenvan:そうです。どのように皮肉なのですか?私は、「選択」アプローチを使って参考文献とビルドの区別を発見しなければなりませんでした。 MSDN [MSBuildスレッド](http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/893d475b-9e0c-485e-b89d-0e7b3712c84e/)ではこれについて少し説明しています。今ユージン・ザハラエフが「実際には条件を設定するために参照を微調整することができるのだろうか?それについては、VSで表示され、UIで編集できない」という返事で。 – J0e3gan

関連する問題