1 // Copyright (c) Microsoft Corporation. All rights reserved.
3 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
4 // WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
5 // WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
6 // THE ENTIRE RISK OF USE OR RESULTS IN CONNECTION WITH THE USE OF THIS CODE
7 // AND INFORMATION REMAINS WITH THE USER.
11 /*********************************************************************
12 * NOTE: A copy of this file exists at: WF\Common\Shared
13 * The two files must be kept in sync. Any change made here must also
14 * be made to WF\Common\Shared\CompilerHelpers.cs
15 *********************************************************************/
17 namespace System.Workflow.Activities.Common
20 using System.Collections;
21 using System.Collections.Specialized;
22 using System.Collections.Generic;
24 using System.CodeDom.Compiler;
25 using System.Workflow.ComponentModel;
26 using Microsoft.CSharp;
27 using Microsoft.VisualBasic;
28 using System.Reflection;
29 using Microsoft.Win32;
30 using System.Security;
31 using System.ComponentModel;
33 using System.Diagnostics.CodeAnalysis;
34 using System.Workflow.ComponentModel.Compiler;
36 internal enum SupportedLanguages
42 internal static class CompilerHelpers
44 private const string CompilerVersionKeyword = "CompilerVersion";
46 private static Dictionary<Type, Dictionary<string, CodeDomProvider>> providers = null;
47 private static object providersLock = new object();
49 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
50 internal static CodeDomProvider CreateCodeProviderInstance(Type type)
52 return CreateCodeProviderInstance(type, string.Empty);
55 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
56 internal static CodeDomProvider CreateCodeProviderInstance(Type type, string compilerVersion)
58 CodeDomProvider provider = null;
59 if (string.IsNullOrEmpty(compilerVersion))
61 if (type == typeof(CSharpCodeProvider))
62 provider = new CSharpCodeProvider();
63 else if (type == typeof(VBCodeProvider))
64 provider = new VBCodeProvider();
66 provider = (CodeDomProvider)Activator.CreateInstance(type);
70 //otherwise pass the compiler version parameter into it
71 Dictionary<string, string> options = new Dictionary<string, string>();
72 options.Add(CompilerHelpers.CompilerVersionKeyword, compilerVersion);
73 provider = (CodeDomProvider)Activator.CreateInstance(type, new object[] { options });
79 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
80 static CodeDomProvider GetCodeProviderInstance(Type type, string compilerVersion)
82 CodeDomProvider provider;
85 if (providers == null)
87 providers = new Dictionary<Type, Dictionary<string, CodeDomProvider>>();
90 Dictionary<string, CodeDomProvider> typedProviders;
91 if (!providers.TryGetValue(type, out typedProviders))
93 typedProviders = new Dictionary<string, CodeDomProvider>();
94 providers.Add(type, typedProviders);
97 if (!typedProviders.TryGetValue(compilerVersion, out provider))
99 provider = CreateCodeProviderInstance(type, compilerVersion);
100 typedProviders.Add(compilerVersion, provider);
107 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
108 internal static CodeDomProvider GetCodeDomProvider(SupportedLanguages language)
110 return CompilerHelpers.GetCodeDomProvider(language, string.Empty);
113 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
114 internal static CodeDomProvider GetCodeDomProvider(SupportedLanguages language, string compilerVersion)
116 if (language == SupportedLanguages.CSharp)
118 return GetCodeProviderInstance(typeof(CSharpCodeProvider), compilerVersion);
122 return GetCodeProviderInstance(typeof(VBCodeProvider), compilerVersion);
126 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
127 internal static SupportedLanguages GetSupportedLanguage(IServiceProvider serviceProvider)
129 SupportedLanguages supportedLanguage = SupportedLanguages.CSharp;
130 IWorkflowCompilerOptionsService workflowCompilerOptions = serviceProvider.GetService(typeof(IWorkflowCompilerOptionsService)) as IWorkflowCompilerOptionsService;
131 if (workflowCompilerOptions != null)
132 supportedLanguage = GetSupportedLanguage(workflowCompilerOptions.Language);
133 return supportedLanguage;
136 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
137 internal static SupportedLanguages GetSupportedLanguage(string language)
139 SupportedLanguages supportedLanguage = SupportedLanguages.CSharp;
140 if (!String.IsNullOrEmpty(language) &&
141 (string.Compare(language, "VB", StringComparison.OrdinalIgnoreCase) == 0 ||
142 string.Compare(language, "VisualBasic", StringComparison.OrdinalIgnoreCase) == 0))
143 supportedLanguage = SupportedLanguages.VB;
144 return supportedLanguage;