public Type CompileUserCodeToType(CompilationTargetFx targetFx, Func <string, string> assemblyLocationResolver) { using (MessagesReaderExtensions extensions = new MessagesReaderExtensions(null, fmtInfo.Value.ExtensionsInitData)) { var fieldsProcessor = MessagesReader.CreateNewFieldsProcessor(this.fmtInfo.Value, extensions, tempFilesManager); var type = fieldsProcessor.CompileUserCodeToType(targetFx, assemblyLocationResolver); return(type); } }
Type CompileUserCodeToTypeInternal(CompilationTargetFx targetFx, Func <string, string> assemblyLocationResolver) { using (CSharpCodeProvider prov = new CSharpCodeProvider()) using (var perfop = new Profiling.Operation(trace, "compile user code")) { List <string> refs = new List <string>(); string fullCode = MakeMessagesBuilderCode(inputFieldNames, extensions, outputFields, refs); CompilerParameters cp = new CompilerParameters(); if (targetFx == CompilationTargetFx.RunningFx) { cp.ReferencedAssemblies.Add("System.dll"); cp.CompilerOptions = "/optimize"; } else if (targetFx == CompilationTargetFx.Silverlight) { var silverLightDir = GetSilverlightDir(); foreach (var silverlightAsm in new string[] { "mscorlib.dll", "System.Core.dll", "System.dll" }) { cp.ReferencedAssemblies.Add(silverLightDir + silverlightAsm); } cp.CompilerOptions = "/optimize /nostdlib+"; } List <string> resolvedRefs = new List <string>(); resolvedRefs.Add(assemblyLocationResolver(Assembly.GetExecutingAssembly().FullName)); resolvedRefs.Add(assemblyLocationResolver(typeof(StringSlice).Assembly.FullName)); foreach (string refAsm in refs) { resolvedRefs.Add(assemblyLocationResolver(refAsm)); } foreach (string resoledAsm in resolvedRefs) { cp.ReferencedAssemblies.Add(resoledAsm); } string tempDir = tempFilesManager.GenerateNewName(); Directory.CreateDirectory(tempDir); cp.OutputAssembly = string.Format("{0}{2}UserCode{1}.dll", tempDir, Guid.NewGuid().ToString("N"), Path.DirectorySeparatorChar); // Temp folder will be cleaned when LogJoint starts next time. cp.TempFiles = new TempFileCollection(tempDir, false); cp.TreatWarningsAsErrors = false; CompilerResults cr; using (new CodedomEnvironmentConfigurator()) { perfop.Milestone("started compile"); cr = prov.CompileAssemblyFromSource(cp, fullCode); } if (cr.Errors.HasErrors) { ThrowBadUserCodeException(fullCode, cr); } perfop.Milestone("getting type"); return(cr.CompiledAssembly.GetType("GeneratedMessageBuilder")); } }
Type CompileUserCodeToTypeInternal(CompilationTargetFx targetFx, Func <string, string> assemblyLocationResolver) { throw new NotImplementedException("Code compilaction not supported in silverlight"); }
Type IFieldsProcessor.CompileUserCodeToType(CompilationTargetFx targetFx, Func <string, string> assemblyLocationResolver) { return(CompileUserCodeToTypeInternal(targetFx, assemblyLocationResolver)); }