コード例 #1
0
        /// <summary>
        /// Attempts to obtain class and namespace name of the designer file (if it exists)
        /// </summary>
        /// <param name="neutralItems">List of relevant culture-neutral ResX files</param>
        public void ResolveNamespaceClass(List <ResXProjectItem> neutralItems)
        {
            if (neutralItems == null)
            {
                throw new ArgumentNullException("neutralItems");
            }
            Class     = null;
            Namespace = null;

            // if this file is culture-specific it's designer file is empty - we need to find designer item if corresponding culture-neutral file
            if (IsCultureSpecific())
            {
                DesignerItem = GetNeutralDesignerItem(neutralItems);
            }

            if (DesignerItem != null)    // designer file is set
            {
                if (!File.Exists(DesignerItem.GetFullPath()))
                {
                    RunCustomTool();
                }

                // select first namespace in the designer file
                CodeElement nmspcElemet = null;
                bool        fileOpened;
                var         rootCodeElements = DesignerItem.GetCodeModel(true, false, out fileOpened).CodeElements;

                foreach (CodeElement element in rootCodeElements)
                {
                    if (element.Kind == vsCMElement.vsCMElementNamespace)
                    {
                        Namespace   = element.FullName;
                        nmspcElemet = element;
                        break;
                    }
                }

                var nestedCodeElements = nmspcElemet == null ? rootCodeElements : nmspcElemet.Children;
                // select first class/module in the namespace
                if (nestedCodeElements != null)
                {
                    foreach (CodeElement child in nestedCodeElements)
                    {
                        if (child.Kind == vsCMElement.vsCMElementClass || child.Kind == vsCMElement.vsCMElementModule)
                        {
                            Class = child.Name;
                            break;
                        }
                    }
                }

                if (Namespace == null && DesignerLanguage == LANGUAGE.VB)
                {
                    Namespace = InternalProjectItem.ContainingProject.GetRootNamespace();
                }
            }
            else     // designer file doesn't exist

            // if ResX files is contained in ASP .NET website project, designer files are implicit
            {
                if (InternalProjectItem.ContainingProject != null && InternalProjectItem.ContainingProject.Kind.ToUpper() == StringConstants.WebSiteProject)
                {
                    string relative = InternalProjectItem.GetRelativeURL();

                    // file must be located in App_GlobalResources folder
                    if (!string.IsNullOrEmpty(relative) && relative.StartsWith(StringConstants.GlobalWebSiteResourcesFolder))
                    {
                        Class = Path.GetFileNameWithoutExtension(InternalProjectItem.GetFullPath()); // take file name as a class name
                        if (IsCultureSpecific())                                                     // strip culture-specific info
                        {
                            Class = GetCultureNeutralName();
                            Class = Class.Substring(0, Class.IndexOf('.'));
                        }
                        Namespace = StringConstants.GlobalWebSiteResourcesNamespace; // namespace is hard-coded as "Resources"
                    }
                    else
                    {
                        Class     = null;
                        Namespace = null;
                    }
                }
            }
        }