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