public static bool Execute(bool isSecondPass, string flagsString, string referencePathsString, string sourceAssemblyForPass2, string nameOfAssembliesThatDoNotContainUserCode, bool isBridgeBasedVersion, bool isProcessingCSHTML5Itself, ILogger logger, string typeForwardingAssemblyPath) #endif { string passNumber = (isSecondPass ? "2" : "1"); string operationName = string.Format("C#/XAML for HTML5: BeforeXamlPreprocessor (pass {0})", passNumber); try { using (var executionTimeMeasuring = new ExecutionTimeMeasuring()) { //------- DISPLAY THE PROGRESS ------- logger.WriteMessage(operationName + " started."); //----------------------------------------------------- // Note: we create a static instance of the "ReflectionOnSeparateAppDomainHandler" to avoid reloading the assemblies for each XAML file. // We dispose the static instance in the "AfterXamlPreprocessor" task. //----------------------------------------------------- if (isSecondPass && string.IsNullOrEmpty(sourceAssemblyForPass2)) { throw new Exception(operationName + " failed because the SourceAssembly parameter was not specified during the second pass."); } // Create a new static instance of the "ReflectionOnSeparateAppDomainHandler": ReflectionOnSeparateAppDomainHandler.Current = new ReflectionOnSeparateAppDomainHandler(typeForwardingAssemblyPath); ReflectionOnSeparateAppDomainHandler reflectionOnSeparateAppDomain = ReflectionOnSeparateAppDomainHandler.Current; #if BRIDGE //todo: if we are compiling CSHTML5 itself (or CSHTML5.Stubs), we need to process the XAML files in CSHTML5, // and for that we need to load the XAML types, so we need to load the previous version of CSHTML5 (from // the NuGet package). Note: this is not supposed to lead to a circular reference because it is only used // for the XamlPreprocessor to generate the .xaml.g.cs files from the .xaml files. // To do so, we need to stop skipping the processing of the CSHTML5 and CSHTML5.Stubs assemblies (c.f. // "Skip the assembly if it is not a user assembly" in "LoadAndProcessReferencedAssemblies"). #endif // we load the source assembly early in case we are processing the CSHTML5. if (isSecondPass && isProcessingCSHTML5Itself) { reflectionOnSeparateAppDomain.LoadAssembly(sourceAssemblyForPass2, loadReferencedAssembliesToo: true, isBridgeBasedVersion: isBridgeBasedVersion, isCoreAssembly: false, nameOfAssembliesThatDoNotContainUserCode: nameOfAssembliesThatDoNotContainUserCode); } #if CSHTML5BLAZOR // work-around: reference path string is not correctly setted so we set it manually string referencePathsString = OpenSilverHelper.ReferencePathsString(resolvedReferences); #endif // Retrieve paths of referenced .dlls and load them: HashSet <string> referencePaths = (referencePathsString != null) ? new HashSet <string>(referencePathsString.Split(';')) : new HashSet <string>(); referencePaths.RemoveWhere(s => !s.ToLower().EndsWith(".dll") || s.Contains("DotNetBrowser") || s.ToLower().EndsWith(@"\bridge.dll")); foreach (string referencedAssembly in AssembliesLoadHelper.EnsureCoreAssemblyIsFirstInList(referencePaths)) // Note: we ensure that the Core assembly is loaded first so that types such as "XmlnsDefinitionAttribute" are known when loading the other assemblies. { reflectionOnSeparateAppDomain.LoadAssembly(referencedAssembly, loadReferencedAssembliesToo: false, isBridgeBasedVersion: isBridgeBasedVersion, isCoreAssembly: false, nameOfAssembliesThatDoNotContainUserCode: nameOfAssembliesThatDoNotContainUserCode); } // Load "mscorlib.dll" too (this is useful for resolving Mscorlib types in XAML, such as <system:String x:Key="TestString" xmlns:system="clr-namespace:System;assembly=mscorlib">Test</system:String>) reflectionOnSeparateAppDomain.LoadAssemblyMscorlib(isBridgeBasedVersion: isBridgeBasedVersion, isCoreAssembly: false, nameOfAssembliesThatDoNotContainUserCode: nameOfAssembliesThatDoNotContainUserCode); // Load for reflection the source assembly itself and the referenced assemblies if second path: if (isSecondPass && !isProcessingCSHTML5Itself) { reflectionOnSeparateAppDomain.LoadAssembly(sourceAssemblyForPass2, loadReferencedAssembliesToo: true, isBridgeBasedVersion: isBridgeBasedVersion, isCoreAssembly: false, nameOfAssembliesThatDoNotContainUserCode: nameOfAssembliesThatDoNotContainUserCode); } bool isSuccess = true; //------- DISPLAY THE PROGRESS ------- logger.WriteMessage(operationName + (isSuccess ? " completed in " + executionTimeMeasuring.StopAndGetTimeInSeconds() + " seconds." : " failed.") + "\". IsSecondPass: "******". Source assembly file: \"" + (sourceAssemblyForPass2 ?? "").ToString()); return(isSuccess); } } catch (Exception ex) { if (ReflectionOnSeparateAppDomainHandler.Current != null) { ReflectionOnSeparateAppDomainHandler.Current.Dispose(); } logger.WriteError(operationName + " failed: " + ex.ToString()); return(false); } }