Exemplo n.º 1
0
        private CodeDomProvider GetProviderAndSetExtension(string codeLanguage, ref string outputFile)
        {
            String codeLang;

            if (!_codeLangMapping.TryGetValue(codeLanguage, out codeLang))
            {
                throw new NotSupportedException("The specified code language is not supported: '" +
                                                CodeLanguage +
                                                "'");
            }

            CodeDomProvider provider;

            switch (codeLang)
            {
                case CSharp:
                    provider = new Microsoft.CSharp.CSharpCodeProvider();
                    outputFile = Path.ChangeExtension(outputFile, ".cs");
                    break;
                case VisualBasic:
                    provider = new Microsoft.VisualBasic.VBCodeProvider();
                    outputFile = Path.ChangeExtension(outputFile, ".vb");
                    break;
                case FSharp_cl:
                    provider = new FSharp.Compiler.CodeDom.FSharpCodeProvider();
                    outputFile = Path.ChangeExtension(outputFile, ".fs");
                    break;
                case CPP:
                    // We load the CppCodeProvider via reflection since a hard reference would 
                    // require client machines to have the provider installed just to run the task.
                    // This way relieves us of the dependency.
                    try
                    {
                        Assembly cppCodeProvider = Assembly.Load(CppCodeProviderAssembly);
                        provider = cppCodeProvider.CreateInstance(CppCodeProviderType) 
                                        as CodeDomProvider;
                    }
                    catch(FileLoadException fileLoadEx)
                    {
                        String fusionMessage = String.IsNullOrEmpty(fileLoadEx.FusionLog)
                                                   ? "Turn on fusion logging to diagnose the problem further. " +
                                                     "(Check http://blogs.msdn.com/suzcook/archive"+
                                                     "/2003/05/29/57120.aspx for more info)"
                                                   : "Check fusion log: " + fileLoadEx.FusionLog;
                        Log.LogError("The C++/CLI code provider could not be loaded. " +
                                     fileLoadEx.Message ?? "" +
                                     (fileLoadEx.InnerException == null 
                                                    ? "" 
                                                    : fileLoadEx.InnerException.Message ?? "") +
                                     fusionMessage);
                        provider = null;
                    }
                    catch (FileNotFoundException)
                    {
                        Log.LogError("The C++/CLI code provider wasn't found. "+
                                     "Make sure you have Visual C++ installed.");
                        provider = null;
                    }

                    outputFile = Path.ChangeExtension(outputFile, ".cpp");
                    break;
                default:
                    throw new InvalidOperationException("Shouldn't reach here.");
            }

            return provider;
        }
Exemplo n.º 2
0
        private CodeDomProvider GetProviderAndSetExtension(string codeLanguage, ref string outputFile)
        {
            String codeLang;

            if (!_codeLangMapping.TryGetValue(codeLanguage, out codeLang))
            {
                throw new NotSupportedException("The specified code language is not supported: '" +
                                                CodeLanguage +
                                                "'");
            }

            CodeDomProvider provider;

            switch (codeLang)
            {
            case CSharp:
                provider   = new Microsoft.CSharp.CSharpCodeProvider();
                outputFile = Path.ChangeExtension(outputFile, ".cs");
                break;

            case VisualBasic:
                provider   = new Microsoft.VisualBasic.VBCodeProvider();
                outputFile = Path.ChangeExtension(outputFile, ".vb");
                break;

            case FSharp_cl:
                provider   = new FSharp.Compiler.CodeDom.FSharpCodeProvider();
                outputFile = Path.ChangeExtension(outputFile, ".fs");
                break;

            case CPP:
                // We load the CppCodeProvider via reflection since a hard reference would
                // require client machines to have the provider installed just to run the task.
                // This way relieves us of the dependency.
                try
                {
                    Assembly cppCodeProvider = Assembly.Load(CppCodeProviderAssembly);
                    provider = cppCodeProvider.CreateInstance(CppCodeProviderType)
                               as CodeDomProvider;
                }
                catch (FileLoadException fileLoadEx)
                {
                    String fusionMessage = String.IsNullOrEmpty(fileLoadEx.FusionLog)
                                                   ? "Turn on fusion logging to diagnose the problem further. " +
                                           "(Check http://blogs.msdn.com/suzcook/archive" +
                                           "/2003/05/29/57120.aspx for more info)"
                                                   : "Check fusion log: " + fileLoadEx.FusionLog;
                    Log.LogError("The C++/CLI code provider could not be loaded. " +
                                 fileLoadEx.Message +
                                 (fileLoadEx.InnerException?.Message ?? "") +
                                 fusionMessage);
                    provider = null;
                }
                catch (FileNotFoundException)
                {
                    Log.LogError("The C++/CLI code provider wasn't found. " +
                                 "Make sure you have Visual C++ installed.");
                    provider = null;
                }

                outputFile = Path.ChangeExtension(outputFile, ".cpp");
                break;

            default:
                throw new InvalidOperationException("Shouldn't reach here.");
            }

            return(provider);
        }