Какова лучшая практика для компиляции Silverlight и WPF в одном проекте?

Доказательство того, что (A && C) || (B && C) ≡ (A || B) && C является простым.

Давайте начнем со списка всех возможных перестановок, а затем протестируем их.

const permutations = [
  [false, false, false],
  [false, false, true],
  [false, true, false],
  [false, true, true],
  [true, false, false],
  [true, false, true],
  [true, true, false],
  [true, true, true],
];

permutations.forEach(permutation => {
  const [A, B, C] = permutation;
  console.log(((A && C) || (B && C)) === ((A || B) && C));
});

12
задан Mark Ingram 2 November 2008 в 00:48
поделиться

3 ответа

Я не попробовал его сам (все еще пытающийся найти, что время играет с Silverlight), но разве Вы не могли иметь одного решения с двумя проектами, одно предназначение Silverlight и другое предназначение.NET 3.5, и добавить, общие файлы класса к каждому проекту как Ссылки (щелкните правой кнопкой по проекту, Добавьте Существующий Объект..., Добавьте как Ссылка)?

** Обновление: См. ответ Mark's ниже оценки Компоновщика Проекта. Я использовал это в своем мультипредназначенном составном приложении с ПРИЗМОЙ 2,0 кал, и это - красивая вещь. Я не думаю, что это существовало в ПРИЗМЕ 1.0?

6
ответ дан 2 December 2019 в 19:00
поделиться

Обновление: идет, чтобы показать, что существует почти всегда более легкий путь.:-)

Первый шаг должен использовать условную компиляцию для разделения Silverlight определенный код. (Я предполагаю что Ваша цель "по умолчанию" с быть WPF.)

Во-вторых, Вам будет нужен сценарий сборки, который скомпилирует код для каждой платформы, устанавливание соответствующего определяет и ссылки на сборки.

Смотрите на проект Меча с открытым исходным кодом. Это делает все это.

Вот пример от класса 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);
        }

Если Вы открываете Caliburn in VS и компилируете его, он соответствует против стандартной платформы. Ссылки для.NET 3.5 и WPF, не Silverlight. Это также, почему директивы предварительной обработки"! SILVERLIGHT".

В Вашем сценарии сборки (Меч использует NAnt), у Вас будет цель, которая устанавливает определение для каждой платформы, например, цель 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.

10
ответ дан 2 December 2019 в 19:00
поделиться

Необходимо проверить "шаблоны и методы: Составьте WPF и Silverlight"

http://www.codeplex.com/CompositeWPF/Wiki/View.aspx?title=Home

Это имеет быстрые запуски с версиями WPF/Silvelight того же приложения в одном решении. Также "Компоновщик Проекта", который обновляет источник Вашего приложения WPF, когда Вы изменяете код Silverlight (или наоборот) использующий соединение. Это может быть переопределено, когда у Вас есть версия определенный код.

Примеры все еще немного грубы вокруг краев, но это может дать Вам общее представление о том, как пойти о Вашем проекте.

HTH

3
ответ дан 2 December 2019 в 19:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: