dslVersion - Как увеличить, но все еще поддерживать более старые версии? - PullRequest
0 голосов
/ 29 ноября 2010

Tech : Visual Studio 2010, Visual Studio SDK для визуализации и моделирования

У нас есть коммерческий DSL Visual Studio 2010, когда мы выпускаем новую версию, мы хотим увеличить номер версии. Я открываю DslDefinition.dsl и обновляю номер версии по мере необходимости, а затем выполняю преобразование всех шаблонов, чтобы изменения отражались. DslPackage 'source.extension.vsixmanifest' обновляется в порядке и показывает новый номер версии.

Однако проблема в том, что когда кто-то открывает модель, созданную из версии 1.0.0.0 с обновленной версией 1.0.0.1, он не может открыть модель, причина, по-видимому, в том, что в dslVersion *. Файл диаграммы установлен на 1.0.0.0, который устарел, я могу исправить, вручную обновив dslVersion, но, похоже, нет способа установить поддерживаемый диапазон версий.

Есть ли какое-то решение для этого?

1 Ответ

1 голос
/ 29 ноября 2010

Я решил эту проблему, переопределив метод 'CheckVersion', который находится в классе '* SerializationHelper'. Моя реализация ниже.

     partial class ProductSerializationHelper
    {
        protected override void CheckVersion(Microsoft.VisualStudio.Modeling.SerializationContext serializationContext, System.Xml.XmlReader reader)
        {
            #region Check Parameters
            global::System.Diagnostics.Debug.Assert(serializationContext != null);
            if (serializationContext == null)
                throw new global::System.ArgumentNullException("serializationContext");
            global::System.Diagnostics.Debug.Assert(reader != null);
            if (reader == null)
                throw new global::System.ArgumentNullException("reader");
            #endregion

            global::System.Version expectedVersion = new global::System.Version("2.5.0.0");
            string dslVersionStr = reader.GetAttribute("dslVersion");
            if (dslVersionStr != null)
            {
                try
                {
                    global::System.Version actualVersion = new global::System.Version(dslVersionStr);

// #### THIS IS WHERE I CHANGED FROM '!=' to '>'
                    if (actualVersion > expectedVersion)
                    {
                        ProductSerializationBehaviorSerializationMessages.VersionMismatch(serializationContext, reader, expectedVersion, actualVersion);
                    }
                }
                catch (global::System.ArgumentException)
                {
                    ProductSerializationBehaviorSerializationMessages.InvalidPropertyValue(serializationContext, reader, "dslVersion", typeof(global::System.Version), dslVersionStr);
                }
                catch (global::System.FormatException)
                {
                    ProductSerializationBehaviorSerializationMessages.InvalidPropertyValue(serializationContext, reader, "dslVersion", typeof(global::System.Version), dslVersionStr);
                }
                catch (global::System.OverflowException)
                {
                    ProductSerializationBehaviorSerializationMessages.InvalidPropertyValue(serializationContext, reader, "dslVersion", typeof(global::System.Version), dslVersionStr);
                }
            }
        }
    }
...