38

Noda Timeバージョン1.1の主な目標は、主にWindowsPhoneおよびWindowsStoreアプリをサポートするために、ポータブルクラスライブラリフレーバーを構築することです。これは一部の機能が失われることを意味するため、デスクトップ構成とPCL構成(デバッグ、リリース、および「署名付きリリース」のそれぞれについて)を構築します。

多数のプロジェクトファイルを操作する必要がないように、6つの構成すべてが同じプロジェクトファイルに存在します。プロジェクトファイルは、次のように「PCL」または「Desktop」のいずれかに設定される「Portability」と呼ばれるプロパティを生成するようにカスタマイズされます。

<!-- Set the custom Portability property based on configuration -->
<PropertyGroup>
  <Portability Condition="'$(Configuration)' == 'Debug Portable'">PCL</Portability>
  <Portability Condition="'$(Configuration)' == 'Release Portable'">PCL</Portability>
  <Portability Condition="'$(Configuration)' == 'Signed Release Portable'">PCL</Portability>
  <!-- Default to desktop if not explicitly set above -->
  <Portability Condition="'$(Portability)' == ''">Desktop</Portability>
</PropertyGroup>

次に、上記のプロパティに基づいて、ポータブルとデスクトップの別々のプロパティグループがあります。これは、プロジェクトタイプを「クラスライブラリ」または「ポータブルクラスライブラリ」として定義するものです(共有されているOutputTypeのと一緒に):Library

<!-- Desktop-specific properties -->
<PropertyGroup Condition="'$(Portability)' == 'Desktop'">
  <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  <TargetFrameworkProfile>Client</TargetFrameworkProfile>
</PropertyGroup>

<!-- PCL-specific properties -->
<PropertyGroup Condition="'$(Portability)' == 'PCL'">
  <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
  <ProjectGuid>{c78f6992-28d7-45c9-a4c1-6eaa649f3247}</ProjectGuid>
  <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  <TargetFrameworkProfile>Profile2</TargetFrameworkProfile>
  <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>

これは一般的に非常にうまく機能します-私はさまざまなソリューション構成を持っているので、すぐにすべてをビルドしてテストでき、新しい.csファイルを1つのプロジェクトファイルに追加するだけで済みます。したがって、Visual Studio 2012 Professional(私が使用しているもの)では、完全に満足しています。

Visual Studio Express(VS2010またはVS2012)にソリューションを読み込もうとすると、問題が発生します。ソリューションのロード中に、一部のプロジェクトをロードできないというエラーで失敗し、PCLバージョンをビルドする2つのプロジェクトは、次のようなビルド出力を持ちます。

C:\Path\To\NodaTime.csproj : error  :
     The project file 'C:\Path\To\NodaTime.csproj' cannot be opened.

There is a missing project subtype.
     Subtype: '{786C830F-07A1-408B-BD7F-6EE04809D6DB}'
     is unsupported by this installation.

(わかりやすくするために再フォーマットされています。)2つのプロジェクトはロードを拒否するため、ソースコードを参照することもできません。

ExpressユーザーがPCLバージョンをビルドできなくても、ソリューションをロードし、ソースを参照し、PCL以外のバージョンをビルドできることを本当に望んでいました。MSBuildはコマンドラインから機能しますが、それはそれほど友好的ではありません。

PCLプロジェクト構成を参照するソリューション構成を削除しようとしましたが、役に立ちません。奇妙なことに、次のようにXML要素をコメントアウトすることもできます。

<!-- 
    <ProjectTypeGuids>(Guids as before)</ProjectTypeGuids>
 -->

行を削除しても役に立ちますが、役に立ちません。VisualStudioが実際に実際のXMLファイルとしてロードしていないかのようです。(コメントアウトされた要素を含むバージョンをVS Proにロードしようとはしていません。)

必要に応じて、個別のPCLプロジェクトファイルを生成するルートをたどることもできますが、可能であればそれを避けたいと思います。これにより、通常の開発がより困難になります。同様に、ExpressのみのPCLファイルとソリューションファイルを生成することもできましたが、やはり、生成したくありませんでした。

理想的には、2010年と2012年の両方でVS Expressをサポートしたいのですが、2012年にのみ機能するソリューションがあれば、それは良いスタートです。

では、Visual Studio Expressが、知らないプロジェクトタイプを参照する条件付きプロパティグループ(条件が満たされていない)にもかかわらず、プロジェクトを実際にロードできるように説得する方法はありますか?

4

2 に答える 2

10

ここでのDavidKeanのコメントは、私が今使用している答えを私に与えてくれました。

または、<ProjectTypeGuid>要素を完全に削除します。これにより、ターゲットフレームワークを変更するためのUIなど、「ポータブル」な拡張機能が選択されます。

私はそれを試しました、そしてそれは夢のように働きます。すべてが適切にインストールされているマシンでは、ExpressでPCLバージョンをビルドすることもできます。結果のバイナリが実際にPCLであることを確認しましたが、問題ないようです。

後で問題が発生したことに驚かないでしょうが、今のところ、これは問題なく機能します。Visual Studioの機能強化がなくても簡単に生活できます。プロジェクトのビルド構成が大きく異なるため、プロジェクトはすでに混乱していたため、とにかく大きなメリットは得られていなかったと思います。

于 2013-01-29T20:49:16.900 に答える
3

ここで回答されているように:
ポータブルクラスライブラリを備えたVisual Studio 2012 Express?
そしてここ:
ポータブルクラスライブラリを使用して機能を共有する

ポータブルクラスライブラリプロジェクトはエクスプレスSKUではサポートされていません...完全にサポートするには、より高いSKUが必要です。もちろん、バイナリ(たとえば、参照として使用する)は、プロジェクト/ソースのサポートではありません。

それには単純な理由があると想像できます-VS2012Expressエディションにはさまざまな種類があります:Windows Phone開発用、デスクトップアプリ用、Windows8アプリ用...WindowsPhoneExpressエディションはWindowsPhoneについて知らないに違いありませんプロジェクトタイプおよびその逆。これが、PCLもサポートされていない単純な理由である可能性があります。

ポータブルクラスライブラリのアイデアは本当に素晴らしいですが、それでも多くの点でかなり制限されています。たとえば、私が知る限り、#ifxyを使用した条件付きコンパイルを使用することはできません。開発にVisualStudioExpressを実際に使用する必要がある場合は、参照されたソースファイルと条件付きコンパイルを使用して各プラットフォームのプロジェクトを使用する方がよい場合があります。

于 2013-01-28T08:54:00.713 に答える