1つのプロジェクトでSilverlightとWPFをコンパイルするためのベストプラクティスは何ですか?
-
03-07-2019 - |
質問
Silverlightプロジェクトを完了しました。少し整理してみましょう。コアファイルを取得し、メインのSilverlightアプリから参照する別のプロジェクトに入れたいと思います。 これらのクラスの一部はWPFと互換性があり、Silverlight / WPFコードをすべて1つのプロジェクトに含めることができるようになりたいです。私の理想的なソリューションは、複数の構成が可能な単一のプロジェクトです。だから、
構成:Silverlightは以下を生成します。 Company.Controls.Silverlight.dll
構成:WPFは以下を生成します。 Company.Controls.Wpf.dll
定義を介して分離された同じファイルに同じソースを含めることは可能ですか?
以前にこれをやったことがありますか?
編集: MyCompany.Windows.Controlsなどのプロジェクトごとにソリューションを作成しました。MyCompany.Windows.Controls&には2つのプロジェクトが含まれています。 MyCompany.Windows.Controls.Silverlight。これらの2つのフォルダーの他に、「共有」があります。フォルダー。両方のプロジェクトで使用されるファイルが含まれます。今のところうまくいきます:)
解決
自分で試したことはありません(Silverlightで遊ぶ時間を探しています)クラスファイルを各プロジェクトにリンクとして(プロジェクトを右クリックして、[既存のアイテムを追加...]、[リンクとして追加])?
**更新:プロジェクトリンカーに関するマークの以下の回答を参照してください。 PRISM 2.0 CALを使用したマルチターゲット複合アプリケーションでこれを使用してきましたが、これは素晴らしいことです。これはPRISM 1.0には存在しないと思いますか?
他のヒント
更新:ほとんどの場合、もっと簡単な方法があることを示します。 :-)
最初のステップは、条件付きコンパイルを使用して、Silverlight固有のコードを分離することです。 (「デフォルト」ターゲットはWPFであると想定しています。)
次に、各プラットフォームのコードをコンパイルし、適切な定義とアセンブリ参照を設定するビルドスクリプトが必要です。
オープンソースの Caliburnプロジェクトをご覧ください。これをすべて行います。
これは、CaliburnのExtensionMethodsクラスの例です。
public static T GetResource<T>(this FrameworkElement element, object key)
{
DependencyObject currentElement = element;
while (currentElement != null)
{
var frameworkElement = currentElement as FrameworkElement;
if (frameworkElement != null && frameworkElement.Resources.Contains(key))
return (T)frameworkElement.Resources[key];
#if !SILVERLIGHT
currentElement = (LogicalTreeHelper.GetParent(currentElement) ??
VisualTreeHelper.GetParent(currentElement));
#else
currentElement = VisualTreeHelper.GetParent(currentElement);
#endif
}
if (Application.Current.Resources.Contains(key))
return (T)Application.Current.Resources[key];
return default(T);
}
VSでCaliburnを開いてコンパイルすると、標準フレームワークに準拠します。参照は、Silverlightではなく、.NET 3.5およびWPF用です。前処理ディレクティブが&quot;!SILVERLIGHT&quot;である理由でもあります。
ビルドスクリプト(CaliburnはNAntを使用)には、各プラットフォームの定義を設定するターゲットがあります。たとえば、CaliburnのSilverlightターゲットは次のとおりです。
<target name="config-platform-silverlight20">
<property name="nant.settings.currentframework" value="silverlight-2.0"/>
<property name="build.platform" value="silverlight-2.0"/>
<property name="build.defines" value="${global.build.defines},SILVERLIGHT,SILVERLIGHT_20,NO_WEB,NO_REMOTING,NO_CONVERT,NO_PARTIAL_TRUST,NO_EXCEPTION_SERIALIZATION,NO_SKIP_VISIBILITY,NO_DEBUG_SYMBOLS"/>
<property name="current.path.bin" value="${path.bin}/silverlight-2.0/${build.config}"/>
<property name="current.path.test" value="${path.bin}/silverlight-2.0/tests" />
<property name="current.path.lib" value="${path.lib}/Silverlight" />
</target>
次に、実際のSilverlightビルドを呼び出すターゲットを示します。
<target name="platform-silverlight20" depends="config">
<if test="${framework::exists('silverlight-2.0')}">
<echo message="Building Caliburn ${build.version} for Silverlight v2.0."/>
<call target="config-platform-silverlight20"/>
<copy todir="${current.path.bin}">
<fileset basedir="${current.path.lib}">
<include name="*.dll"/>
<include name="*.xml"/>
</fileset>
</copy>
<call target="core"/>
<call target="messaging"/>
<call target="actions"/>
<call target="commands"/>
<call target="package-platform"/>
</if>
<if test="${not(framework::exists('silverlight-2.0'))}">
<echo message="Silverlight v2.0 is not available. Skipping platform."/>
</if>
</target>
最後に、「コア」の例を次に示します。 Caliburn.Core.dllの生成を担当するターゲット:
<target name="core" depends="config, ensure-platform-selected">
<mkdir dir="${current.path.bin}"/>
<csc keyfile="${path.src}/Caliburn.snk" noconfig="true" warnaserror="false" target="library" debug="${build.debug}" optimize="${build.optimize}" define="${build.defines}"
output="${current.path.bin}/Caliburn.Core.dll"
doc="${current.path.bin}/Caliburn.Core.xml">
<sources basedir="${path.src}">
<include name="${build.asminfo}"/>
<include name="Caliburn.Core/**/*.cs"/>
</sources>
<references basedir="${current.path.bin}">
<include name="mscorlib.dll"/>
<include name="System.dll"/>
<include name="System.Core.dll"/>
<!--WPF-->
<include name="PresentationCore.dll"/>
<include name="PresentationFramework.dll"/>
<include name="WindowsBase.dll"/>
<!--Silverlight-->
<include name="System.Windows.dll" />
</references>
<nowarn>
<warning number="1584"/>
</nowarn>
</csc>
</target>
必要なアセンブリの参照方法に注意してください。
おそらく、NAnt.exe.configを編集して(NAntを使用している場合)、Silverlightフレームワークの正しいバージョンに一致させる必要があります。 Silverlight RTWの場合、フレームワークバージョンは2.0.31005.0になります。
&quot;パターン&amp;プラクティス:コンポジットWPFおよびSilverlight&quot;
http://www.codeplex.com/CompositeWPF/Wiki /View.aspx?title=Home
1つのソリューションで、同じアプリのWPF / Silvelightバージョンでクイックスタートがあります。 また、「プロジェクトリンカー」リンクを使用してSilverlightコードを変更(またはその逆)すると、WPFアプリのソースが更新されます。バージョン固有のコードがある場合は上書きできます。
例はまだ少し荒っぽいですが、プロジェクトの進め方のアイデアを与えるかもしれません。
HTH