public override void GenerateCode(AssemblyBuilder assemblyBuilder)
        {
            // Only attempt to get the Indigo provider once
            if (!s_triedToGetWebRefType)
            {
                s_indigoWebRefProviderType = BuildManager.GetType(IndigoWebRefProviderTypeName, false /*throwOnError*/);
                s_triedToGetWebRefType     = true;
            }

            // If we have an Indigo provider, instantiate it and forward the GenerateCode call to it
            if (s_indigoWebRefProviderType != null)
            {
                BuildProvider buildProvider = (BuildProvider)HttpRuntime.CreateNonPublicInstance(s_indigoWebRefProviderType);
                buildProvider.SetVirtualPath(VirtualPathObject);
                buildProvider.GenerateCode(assemblyBuilder);
            }

            // e.g "/MyApp/Application_WebReferences"
            VirtualPath rootWebRefDirVirtualPath = HttpRuntime.WebRefDirectoryVirtualPath;

            // e.g "/MyApp/Application_WebReferences/Foo/Bar"
            string currentWebRefDirVirtualPath = _vdir.VirtualPath;

            Debug.Assert(StringUtil.StringStartsWithIgnoreCase(
                             currentWebRefDirVirtualPath, rootWebRefDirVirtualPath.VirtualPathString));

            string ns;

            if (rootWebRefDirVirtualPath.VirtualPathString.Length == currentWebRefDirVirtualPath.Length)
            {
                // If it's the root WebReferences dir, use the empty namespace
                ns = String.Empty;
            }
            else
            {
                // e.g. "Foo/Bar"
                Debug.Assert(rootWebRefDirVirtualPath.HasTrailingSlash);
                currentWebRefDirVirtualPath = UrlPath.RemoveSlashFromPathIfNeeded(currentWebRefDirVirtualPath);
                currentWebRefDirVirtualPath = currentWebRefDirVirtualPath.Substring(
                    rootWebRefDirVirtualPath.VirtualPathString.Length);

                // Split it into chunks separated by '/'
                string[] chunks = currentWebRefDirVirtualPath.Split('/');

                // Turn all the relevant chunks into valid namespace chunks
                for (int i = 0; i < chunks.Length; i++)
                {
                    chunks[i] = Util.MakeValidTypeNameFromString(chunks[i]);
                }

                // Put the relevant chunks back together to form the namespace
                ns = String.Join(".", chunks);
            }
#if !FEATURE_PAL // FEATURE_PAL does not support System.Web.Services
            CodeNamespace codeNamespace = new CodeNamespace(ns);

            // for each discomap file, read all references and add them to the WebReferenceCollection
            WebReferenceCollection webs = new WebReferenceCollection();

            bool hasDiscomap = false;

            // Go through all the discomap in the directory
            foreach (VirtualFile child in _vdir.Files)
            {
                string extension = UrlPath.GetExtension(child.VirtualPath);
                extension = extension.ToLower(CultureInfo.InvariantCulture);

                if (extension == ".discomap")
                {
                    // NOTE: the WebReferences code requires physical path, so this feature
                    // cannot work with a non-file based VirtualPathProvider
                    string physicalPath = HostingEnvironment.MapPath(child.VirtualPath);

                    DiscoveryClientProtocol client = new DiscoveryClientProtocol();
                    client.AllowAutoRedirect = true;
                    client.Credentials       = CredentialCache.DefaultCredentials;

                    client.ReadAll(physicalPath);

                    WebReference webRefTemp = new WebReference(client.Documents, codeNamespace);

                    //

                    string fileName          = System.IO.Path.ChangeExtension(UrlPath.GetFileName(child.VirtualPath), null);
                    string appSetttingUrlKey = ns + "." + fileName;

                    WebReference web = new WebReference(client.Documents, codeNamespace, webRefTemp.ProtocolName, appSetttingUrlKey, null);

                    webs.Add(web);

                    hasDiscomap = true;
                }
            }

            // If we didn't find any discomap files, we have nothing to generate
            if (!hasDiscomap)
            {
                return;
            }

            CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
            codeCompileUnit.Namespaces.Add(codeNamespace);

            //public static StringCollection GenerateWebReferences(WebReferenceCollection webReferences, CodeDomProvider codeProvider, CodeCompileUnit codeCompileUnit, WebReferenceOptions options) {
            WebReferenceOptions options = new WebReferenceOptions();
            options.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync | CodeGenerationOptions.GenerateOldAsync;
            options.Style   = ServiceDescriptionImportStyle.Client;
            options.Verbose = true;
            StringCollection shareWarnings = ServiceDescriptionImporter.GenerateWebReferences(webs, assemblyBuilder.CodeDomProvider, codeCompileUnit, options);
            // Add the CodeCompileUnit to the compilation
            assemblyBuilder.AddCodeCompileUnit(this, codeCompileUnit);
#else // !FEATURE_PAL
            return;
#endif // !FEATURE_PAL
        }
    internal virtual void AddBuildProvider(BuildProvider buildProvider) {

        // By default, use the build provider itself as the key
        object hashtableKey = buildProvider;

        bool isFolderLevel = false;

        // If the buildProvider is a folderLevel build provider, use the build provider itself
        // so that multiple build providers can work on the same path.
        if (_compConfig.FolderLevelBuildProviders != null) {
            Type t = buildProvider.GetType();
            isFolderLevel = _compConfig.FolderLevelBuildProviders.IsFolderLevelBuildProvider(t);
        }

        // Keep track of the build provider's virtual path, if any
        if (buildProvider.VirtualPath != null && !isFolderLevel) {

            // It has a virtual path, so use that as the key
            hashtableKey = buildProvider.VirtualPath;

            // If we already had it, ignore it.  This can happen when there is a user control
            // with a code beside in App_Code (VSWhidbey 481426)
            if (_buildProviders.ContainsKey(hashtableKey))
                return;
        }

        _buildProviders[hashtableKey] = buildProvider;

        // Ask the provider to generate the code
        // If it throws an Xml exception, extra the relevant info and turn it
        // into our own ParseException
        try {
            buildProvider.GenerateCode(this);
        }
        catch (XmlException e) {
            throw new HttpParseException(e.Message, null /*innerException*/,
                buildProvider.VirtualPath, null /*sourceCode*/, e.LineNumber);
        }
        catch (XmlSchemaException e) {
            throw new HttpParseException(e.Message, null /*innerException*/,
                buildProvider.VirtualPath, null /*sourceCode*/, e.LineNumber);
        }
        catch (Exception e) {
            throw new HttpParseException(e.Message, e,
                buildProvider.VirtualPath, null /*sourceCode*/, 1);
        }

        // Handle any 'compileWith' dependencies, i.e. files that must be compiled
        // within the same assembly as the current file
        InternalBuildProvider internalBuildProvider = buildProvider as InternalBuildProvider;
        if (internalBuildProvider != null) {
            ICollection compileWith = internalBuildProvider.GetCompileWithDependencies();
            if (compileWith != null) {
                foreach (VirtualPath virtualPath in compileWith) {

                    // If we already have it, ignore it
                    if (_buildProviders.ContainsKey(virtualPath.VirtualPathString))
                        continue;

                    // Add the compileWith dependency to our compilation
                    AddCompileWithBuildProvider(virtualPath, internalBuildProvider);
                }
            }
        }

    }
Example #3
0
        public override void GenerateCode(AssemblyBuilder assemblyBuilder)
        {
            string str2;

            if (!s_triedToGetWebRefType)
            {
                s_indigoWebRefProviderType = BuildManager.GetType("System.Web.Compilation.WCFBuildProvider", false);
                s_triedToGetWebRefType     = true;
            }
            if (s_indigoWebRefProviderType != null)
            {
                BuildProvider provider = (BuildProvider)HttpRuntime.CreateNonPublicInstance(s_indigoWebRefProviderType);
                provider.SetVirtualPath(base.VirtualPathObject);
                provider.GenerateCode(assemblyBuilder);
            }
            VirtualPath webRefDirectoryVirtualPath = HttpRuntime.WebRefDirectoryVirtualPath;
            string      virtualPath = this._vdir.VirtualPath;

            if (webRefDirectoryVirtualPath.VirtualPathString.Length == virtualPath.Length)
            {
                str2 = string.Empty;
            }
            else
            {
                string[] strArray = UrlPath.RemoveSlashFromPathIfNeeded(virtualPath).Substring(webRefDirectoryVirtualPath.VirtualPathString.Length).Split(new char[] { '/' });
                for (int i = 0; i < strArray.Length; i++)
                {
                    strArray[i] = Util.MakeValidTypeNameFromString(strArray[i]);
                }
                str2 = string.Join(".", strArray);
            }
            CodeNamespace          proxyCode     = new CodeNamespace(str2);
            WebReferenceCollection webReferences = new WebReferenceCollection();
            bool flag = false;

            foreach (VirtualFile file in this._vdir.Files)
            {
                if (UrlPath.GetExtension(file.VirtualPath).ToLower(CultureInfo.InvariantCulture) == ".discomap")
                {
                    string topLevelFilename          = HostingEnvironment.MapPath(file.VirtualPath);
                    DiscoveryClientProtocol protocol = new DiscoveryClientProtocol {
                        AllowAutoRedirect = true,
                        Credentials       = CredentialCache.DefaultCredentials
                    };
                    protocol.ReadAll(topLevelFilename);
                    WebReference reference        = new WebReference(protocol.Documents, proxyCode);
                    string       str5             = Path.ChangeExtension(UrlPath.GetFileName(file.VirtualPath), null);
                    string       appSettingUrlKey = str2 + "." + str5;
                    WebReference webReference     = new WebReference(protocol.Documents, proxyCode, reference.ProtocolName, appSettingUrlKey, null);
                    webReferences.Add(webReference);
                    flag = true;
                }
            }
            if (flag)
            {
                CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
                codeCompileUnit.Namespaces.Add(proxyCode);
                WebReferenceOptions options = new WebReferenceOptions {
                    CodeGenerationOptions = CodeGenerationOptions.GenerateOldAsync | CodeGenerationOptions.GenerateNewAsync | CodeGenerationOptions.GenerateProperties,
                    Style   = ServiceDescriptionImportStyle.Client,
                    Verbose = true
                };
                ServiceDescriptionImporter.GenerateWebReferences(webReferences, assemblyBuilder.CodeDomProvider, codeCompileUnit, options);
                assemblyBuilder.AddCodeCompileUnit(this, codeCompileUnit);
            }
        }