ما هي أفضل الممارسات من أجل تجميع Silverlight و WPF في مشروع واحد ؟

StackOverflow https://stackoverflow.com/questions/208123

سؤال

لقد أنجزت مشروع Silverlight و حان الوقت قليلا تنظيف.أود أن أغتنم بلدي الملفات الأساسية ووضعها في مشروع منفصل والتي سوف ترجع من بلدي الرئيسية سيلفرلايت التطبيق.بعض هذه الطبقات متوافقة مع WPF وأنا أحب أن تكون قادرة على سيلفرلايت / WPF رمز كل واحد في المشروع.بلدي الحل المثالي هو أن يكون مشروع واحد الذي يسمح تكوينات متعددة.لذلك ،

التكوين:سيلفرلايت من شأنها أن تولد:Company.Controls.Silverlight.dll

التكوين:WPF من شأنها أن تولد:Company.Controls.Wpf.dll

هل من الممكن أن يكون نفس المصدر في نفس الملف فقط فصل عبر يعرف?

وقد أي شخص من أي فعلت هذا من قبل ؟

تحرير: لقد خلق الحل في المشروع ، مثل MyCompany.يقوم نظام ويندوز.ضوابط ، ثم الذي يحتوي على 2 ، MyCompany.يقوم نظام ويندوز.الضوابط & MyCompany.يقوم نظام ويندوز.الضوابط.سيلفرلايت.جنبا إلى جنب مع أولئك 2 المجلدات لدي "مشترك" في المجلد الذي يحتوي على الملفات المستخدمة من قبل كلا المشروعين.أنه يعمل بشكل جيد حتى الآن :)

هل كانت مفيدة؟

المحلول

انا لم اجرب ذلك بنفسي (لا تزال تحاول أن تجد الوقت للعب مع سيلفرلايت), ولكن لم يكن لديك حل واحد مع اثنين من المشاريع التي تستهدف سيلفرلايت وغيرها من تصويبها .NET framework 3.5 ، إضافة المشتركة ملفات فئة لكل مشروع وصلات (انقر بزر الماوس الأيمن فوق المشروع ، إضافة عنصر موجود..., إضافة رابط)?

** تحديث:انظر مارك الإجابة أدناه بشأن مشروع Linker.لقد تم استخدام هذا في بلدي متعددة استهدفت مركب التطبيق مع منظور 2.0 كال ، إنه شيء جميل.أنا لا أعتقد أن هذا موجود في المنشور 1.0?

نصائح أخرى

تحديث:يذهب إلى إظهار أن هناك دائما تقريبا طريقة أسهل.:-)

الخطوة الأولى هي استخدام الشرطية إلى فصل سيلفرلايت رمز معين.(أنا على افتراض أن "الافتراضي" الهدف مع 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);
        }

إذا قمت بفتح Caliburn في مقابل وتجميع ذلك ، فإنه يتوافق ضد الإطار القياسية.المراجع هي .NET 3.5 WPF, لا سيلفرلايت.وهذا هو السبب أيضا في المعالجة التوجيهات "!سيلفرلايت".

في بناء النصي (Caliburn يستخدم نانت), سوف يكون الهدف الذي يضع ويحدد لكل منصة ، على سبيل المثال ، Caliburn هو سيلفرلايت الهدف هو:

<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>

ثم هنا هو الهدف الذي الاحتجاج الفعلي سيلفرلايت بناء:

<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>

لاحظ طريقة الرجوع اللازمة الجمعيات.

ربما ستحتاج إلى تعديل نانت.exe.التكوين (إذا كنت تستخدم نانت) لتتناسب مع الإصدار الصحيح من سيلفرلايت الإطار.ل Silverlight RTW ، framework الإصدار سوف يكون 2.0.31005.0.

يجب أن تحقق "أنماط & الممارسات:مركب WPF و Silverlight"

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

وقد سريعة يبدأ مع WPF/Silvelight إصدارات من نفس التطبيق في حل واحد.أيضا مشروع "رابط" أن التحديثات مصدر WPF التطبيق عند تغيير سيلفرلايت رمز (أو العكس بالعكس) باستخدام ربط.فإنه يمكن تجاوزها عندما يكون لديك نسخة كود معين.

الأمثلة لا تزال الخام قليلا حول الحواف ولكن قد تعطيك فكرة عن كيفية الذهاب عن المشروع الخاص بك.

HTH

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top