5

BuildingInVsideisualStudioプロパティを使用して、csproj内の同じdllへのプロジェクトとファイル参照を追加しようとしています。ただし、それらが一緒にcsprojにある場合は、ファイル参照のみが取得されます。ファイル参照を削除すると、csprojが取得されます。注文を入れ替えてみましたが、うまくいきませんでした。これが機能しない理由はありますか?

基本的な考え方は次のとおりです。

<ItemGroup Condition="'$(BuildingInsideVisualStudio)' == false">
    <Reference Include="MyNamespace.Mine">
        <HintPath>..\$(OutDir)\MyNamespace.Mine.dll</HintPath>
    </Reference>
</ItemGroup>
<ItemGroup Condition="'$(BuildingInsideVisualStudio)' == '' Or '$(BuildingInsideVisualStudio)' == true">
    <ProjectReference Include="..\MyNamespace.Mine.csproj">
        <Project>{GUID}</Project>
        <Name>MyNamespace.Mine</Name>
    </ProjectReference>
</ItemGroup>

他の誰かもこの道を進んでいますが、いくつかの注意点があるようです。ビルドプロセスは変更できないため、これを条件付きで行う必要があります。ファイル参照を使用すると、[定義に移動]と[すべての参照を検索]が失われます(申し訳ありませんが、これを解決するためにReSharperをインストールすることもできません)。

4

4 に答える 4

7

私が見る2つの問題:

  1. $(BuildingInsideVisualStudio)空になる可能性があることを考慮していません( '')。最初の条件の使用:

    <ItemGroup Condition="'$(BuildingInsideVisualStudio)' != 'true'">

  2. 常に両方のオペランドを一重引用符で囲みます。

    <ItemGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">


MSDNリファレンス:

単純な英数字の文字列またはブール値には、一重引用符は必要ありません。ただし、空の値には一重引用符が必要です。


アップデート:

長い道のりかもしれませんが、プロパティ定義の条件を使用してみることができます。

<PropertyGroup Condition="'$(BuildingInsideVisualStudio)' != 'true'"><!-- In CMD -->
    <ReferenceInclude>MyNamespace.Mine"</ReferenceInclude>
    <ReferenceIncludePath>..\$(OutDir)\MyNamespace.Mine.dll</ReferenceIncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'"><!-- In VS -->
    <ProjectReferenceInclude>..\MyNamespace.Mine.csproj</ProjectReferenceInclude>
    <ProjectReferenceIncludeId>{GUID}</ProjectReferenceIncludeId>
</PropertyGroup> 

したがって、参照は条件付きで解決されます。

<ItemGroup>
    <Reference Include="$(ReferenceInclude)">
        <HintPath>$(ReferenceIncludePath)</HintPath>
    </Reference>
</ItemGroup>
<ItemGroup>
    <ProjectReference Include="$(ProjectReferenceInclude)">
        <Project>$(ProjectReferenceIncludeId)</Project>
        <Name>%(ProjectReferenceInclude.MSBuildProjectName)</Name>
    </ProjectReference>
</ItemGroup>
于 2012-05-28T22:26:54.117 に答える
2

Visual Studio 2010 および 2012 では、条件付きの参照を追加する代わりに、Choose ステートメントを使用することもできます。これははるかにうまくいくようです:

<Choose>
  <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
    <ItemGroup>
      <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
    </ItemGroup>
  </Otherwise>
</Choose>
于 2012-08-23T12:02:20.810 に答える
1

少し実験した後、質問を正しく理解したと仮定すると、それらに別の名前を付けることでほとんどの問題が解決するようです。msbuild は条件を尊重し、アセンブリ参照を使用します。VS は両方をソリューション エクスプローラーに表示しますが、プロジェクトの種類であるかのように参照を事前にビルドし、R# が機能せずに goto-definition を保持します。条件付きインポートは検討する価値のある別のものですが、試したことはありません。

<ItemGroup>
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Condition="'$(Foo)'=='Bar1'">
        <Project>{FD0E01BC-7777-4620-9EF2-5F60804B3173}</Project>
        <Name>ClassLibrary1-ProjRef</Name>
    </ProjectReference>
    <Reference Include="ClassLibrary1" Condition="'$(Foo)'=='Bar2'">
        <Name>ClassLibrary1-AssRef</Name>
        <HintPath>..\ClassLibrary1\bin\Debug\ClassLibrary1.dll</HintPath>
    </Reference>
</ItemGroup>
于 2012-06-06T01:24:30.943 に答える
0

Microsoft が Connect に関するこの質問に投稿した回答は、Visual Studio がプロジェクトかどうかに関係なく、アセンブリ参照の条件を意図的に無視していることを示しています。これは理解できます。ただし、プロジェクト ファイルに同じアセンブリへの複数の参照が含まれている場合、解決プロセスは常にファイル ベースの参照を優先するようです。これは意味がありません。

つまり、ファイル参照が同じアセンブリに存在する場合でも、VS にプロジェクト参照を考慮するように指示する方法がない限り、運が悪いということです。これを行う方法がわかりません。また、何らかの形でまだ可能かどうかも知りたいです。

于 2012-06-03T14:38:32.570 に答える