更新:这证明了几乎总会有更简单的方法。 :-)
第一步是使用条件编译来隔离Silverlight特定的代码。(我假设你的“默认”目标是WPF。)
其次,您需要一个生成脚本,将为每个平台编译代码,并设置适当的定义和程序集引用。
看看开源Caliburn项目。它可以完成所有这些操作。
这里是来自Caliburn的ExtensionMethods类的示例。
public static T GetResource<T>(this FrameworkElement element, object key)
if (Application.Current.Resources.Contains(key))
return (T)Application.Current.Resources[key];
return default(T);
}
如果您在VS中打开Caliburn并编译它,则会针对标准框架进行编译。引用是针对.NET 3.5和WPF而不是Silverlight的。这也是为什么预处理指令为“!SILVERLIGHT”的原因。
在您的构建脚本(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"/>
<include name="PresentationCore.dll"/>
<include name="PresentationFramework.dll"/>
<include name="WindowsBase.dll"/>
<include name="System.Windows.dll" />
</references>
<nowarn>
<warning number="1584"/>
</nowarn>
</csc>
</target>
注意它引用所需的程序集方式。
如果您正在使用NAnt,则可能需要编辑NAnt.exe.config以匹配正确版本的Silverlight框架。对于Silverlight RTW,框架版本将是2.0.31005.0。