هل يمكنني التحكم في الموقع .صافي إعدادات المستخدم لتجنب فقدان الإعدادات في التطبيق الترقية ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أحاول تخصيص موقع user.config الملف.حاليا يتم تخزينها مع تجزئة و رقم الإصدار

%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\

أريد أن يكون الملحد إلى نسخة من التطبيق

%AppData%\[CompanyName]\[ProductName]\

يمكن أن يتم ذلك وكيف ؟ ما هي الآثار المترتبة على ذلك ؟ سيكون المستخدم تفقد الإعدادات من النسخة السابقة بعد الترقية ؟

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

المحلول

للإجابة على السؤال الأول ، من الناحية الفنية يمكن وضع الملف في أي مكان تريد ، ومع ذلك سيكون لديك رمز ذلك بنفسك ، الافتراضي مكان الملف يذهب هو أول من اثنين من الأمثلة.(رابط كيف تفعل ذلك بنفسك)

أما عن السؤال الثاني ، فإنه يعتمد على كيفية نشر التطبيق.إذا قمت بنشر طريق .msi, ثم هناك نوعان من تجزئات في خصائص إعداد المشروع (أن msi بنيت من) ، 'ترقية المدونة" و "رمز المنتج'.هذه تحدد كيفية msi يمكن أن تكون مثبتة ، وإذا كان ترقيات, الكتابة, أو تثبيت بجوار أي إصدار آخر من نفس التطبيق.

على سبيل المثال, إذا كان لديك نسختين من البرنامج ولديهم مختلفة 'ترقية' رموز ، ثم إلى windows فهي مختلفة تماما قطعة من البرمجيات بغض النظر عن الاسم.ومع ذلك إذا كان 'ترقية' رمز هو نفسه ، ولكن 'المنتج' رمز مختلفة ثم عند محاولة تثبيت 2 msi وسوف يطلب منك إذا كنت ترغب في الترقية ، في الوقت الذي كان من المفترض أن نسخ القيم من التكوين إلى تكوين جديد.إذا كان كل القيم هي نفسها ، ورقم الإصدار لم يتغير ثم تكوين جديد سوف يكون في نفس الموقع القديم التكوين و لن تضطر إلى القيام بأي شيء. وثائق MSDN

ClickOnce هو مختلفة قليلا ، لأن بناء أكثر من ClickOnce الإصدار # و مسار عنوان URL ، ومع ذلك وجدت أنه طالما كنت الاستمرار في 'نشر' إلى نفس الموقع النسخة الجديدة من التطبيق سوف تستمر في استخدام القائمة config.(رابط كيف ClickOnce مقابض التحديثات)

أعرف أيضا أن هناك طريقة يدويا دمج التكوينات أثناء تثبيت msi باستخدام مخصص تثبيت البرامج النصية, ولكن أنا لا أتذكر بالضبط الخطوات للقيام بذلك...(انظر هذا رابط كيفية القيام بذلك مع شبكة الإنترنت.التكوين)

نصائح أخرى

أردت أن أضيف هذا النص المقتبس كمرجع عندما يكون لدي هذه المشكلة في المستقبل.يفترض يمكنك إرشاد ApplicationSettings البنية التحتية إلى إعدادات النسخ من النسخة السابقة من خلال الدعوة ترقية:

Properties.Settings.Value.Upgrade();

من إعدادات العميل التعليمات بلوق وظيفة: (أرشيف)

Q:لماذا هناك رقم الإصدار في المستخدم.التكوين الطريق ؟ إذا كنت نشر نسخة جديدة من التطبيق ، لن المستخدم تفقد كافة الإعدادات المحفوظة السابقة الإصدار ؟

A:هناك عدة أسباب لماذا المستخدم.التكوين مسار النسخة الحساسة.

(1) دعم الجانب النشر من إصدارات مختلفة من تطبيق (يمكنك أن تفعل هذا مع Clickonce ، على سبيل المثال).فمن ممكن نسخة مختلفة من طلب الحصول على إعدادات مختلفة حفظها.

(2) عند ترقية تطبيق إعدادات الطبقة قد تم تغييره و قد لا يكون متوافق مع ما حفظ ، والتي يمكن أن تؤدي إلى مشاكل.

ومع ذلك, لقد جعلت من السهل ترقية الإعدادات السابقة نسخة من التطبيق أحدث.ببساطة الاتصال ApplicationSettingsBase.ترقية() و فإنه سيتم استرداد الإعدادات من النسخة السابقة التي تطابق الإصدار الحالي من فئة متجر في الإصدار الحالي هو المستخدم.ملف التكوين.لديك أيضا خيار تجاوز هذا السلوك إما في الإعدادات الخاصة بك أو الطبقة أو في مزود التنفيذ.

Q:حسنا ولكن كيف أعرف متى دعوة الترقية ؟

A:سؤال جيد.في Clickonce ، عندما تثبيت نسخة جديدة من تطبيق ApplicationSettingsBase سيتم الكشف عن تلقائيا ترقية إعدادات لك في هذه النقطة الإعدادات يتم تحميلها.في غير Clickonce الحالات لا يوجد الترقية التلقائية - عليك الاتصال ترقية نفسك.هنا هو فكرة واحدة لتحديد متى للاتصال الترقية:

وقد منطقية الإعداد يسمى CallUpgrade وإعطائها الافتراضي قيمة true.عند بدء تشغيل التطبيق الخاص بك حتى يمكنك أن تفعل شيئا مثل:

if (Properties.Settings.Value.CallUpgrade)
{
   Properties.Settings.Value.Upgrade();
   Properties.Settings.Value.CallUpgrade = false;    
}

هذا سوف تضمن ترقية() هو فقط أول مرة التطبيق يعمل بعد نسخة جديدة يتم نشرها.

لا أعتقد للحظة أنه يمكن أن تعمل في الواقع - ليس هناك طريقة مايكروسوفت سوف توفر هذه القدرة ، ولكن الأسلوب هو وجود نفسه فقط.

المستخدم.config يتم تخزينها في

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

<c:\Documents and Settings> المستخدم دليل البيانات إما غير التجوال (إعدادات المحلية أعلاه) أو التجوال.
<username> هو اسم المستخدم.
<companyname> هو CompanyNameAttribute القيمة ، إن وجدت.وإلا تجاهل هذا العنصر.
<appdomainname> هو AppDomain.CurrentDomain.FriendlyName.هذا عادة ما الافتراضية .exe اسم.
<eid> هو عنوان URL ، StrongName أو مسار, بناء على الأدلة المتاحة إلى تجزئة.
<hash> هو SHA1 تجزئة الأدلة التي تم جمعها من CurrentDomain ، حسب الأفضلية التالية:
1.StrongName
2.URL:
إذا لم يكن أي من هذه هو متاح،.exe المسار.
<version> هو AssemblyInfo هو AssemblyVersionAttribute الإعداد.

الوصف الكامل هنا http://msdn.microsoft.com/en-us/library/ms379611.aspx

(كنت أود أن أضيف هذا التعليق @Amr هي الإجابة, ولكن ليس لدي ما يكفي من مندوب إلى فعل ذلك بعد.)

على معلومات في المقالة MSDN واضح جدا ويبدو أنها لا تزال سارية.ومع ذلك فإنه لا يذكر أن SHA1 hash هو مكتوب من قاعدة 32 المشفرة بدلا من أكثر نموذجية قاعدة 16.

أعتقد الخوارزمية المستخدمة في تنفيذها ToBase32StringSuitableForDirName, ، يمكن العثور عليها هنا في Microsoft المصدر المرجعي.

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