dslVersion - 如何增加但仍然支持旧版本?

时间:2010-11-29 10:18:36

标签: visual-studio-2010 dsl dsl-tools

技术:Visual Studio 2010,Visual Studio Visualization&建模SDK

我们有一个商业Visual Studio 2010 DSL,当我们发布新版本时,我们想要增加版本号。我打开DslDefinition.dsl并根据需要更新版本号,然后执行转换所有模板,以便反映更改。 DslPackage'edource.extension.vsixmanifest'得到更新,并显示新的版本号。

然而,问题是当有人打开从版本1.0.0.0创建的模型并使用更新版本1.0.0.1然后他们无法打开模型时,原因似乎是*中的'dslVersion'。图文件设置为1.0.0.0已经过时,我可以通过手动更新dslVersion来修复,但似乎没有办法设置支持的版本范围。

有没有解决这个问题?

1 个答案:

答案 0 :(得分:1)

我通过覆盖位于'* SerializationHelper'类中的'CheckVersion'方法解决了这个问题。我的实现如下。

     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);
                }
            }
        }
    }