// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0
+
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
internal class AppCodeAssembly
{
- private List<string> files;
- private List<CodeCompileUnit> units;
+ List<string> files;
+ List<CodeCompileUnit> units;
- private string name;
- private string path;
- private bool validAssembly;
- private string outputAssemblyName;
+ string name;
+ string path;
+ bool validAssembly;
+ string outputAssemblyName;
public string OutputAssemblyName
{
}
CodeDomProvider provider = null;
- CompilationSection compilationSection = WebConfigurationManager.GetSection ("system.web/compilation") as CompilationSection;
+ CompilationSection compilationSection = WebConfigurationManager.GetWebApplicationSection ("system.web/compilation") as CompilationSection;
if (compilerInfo == null) {
if (!CodeDomProvider.IsDefinedLanguage (compilationSection.DefaultLanguage))
throw new HttpException ("Failed to retrieve default source language");
compilerInfo = CodeDomProvider.GetCompilerInfo (compilationSection.DefaultLanguage);
if (compilerInfo == null || !compilerInfo.IsCodeDomProviderTypeValid)
throw new HttpException ("Internal error while initializing application");
- provider = compilerInfo.CreateProvider ();
- if (provider == null)
- throw new HttpException ("A code provider error occurred while initializing application.");
}
provider = compilerInfo.CreateProvider ();
foreach (Assembly a in BuildManager.TopLevelAssemblies)
parameters.ReferencedAssemblies.Add (a.Location);
CompilerResults results = abuilder.BuildAssembly (parameters);
+ if (results == null)
+ return;
+
if (results.NativeCompilerReturnValue == 0) {
BuildManager.CodeAssemblies.Add (results.CompiledAssembly);
BuildManager.TopLevelAssemblies.Add (results.CompiledAssembly);
}
}
- private string PhysicalToVirtual (string file)
+ VirtualPath PhysicalToVirtual (string file)
{
- return file.Replace (HttpRuntime.AppDomainAppPath, "/").Replace (Path.DirectorySeparatorChar, '/');
+ return new VirtualPath (file.Replace (HttpRuntime.AppDomainAppPath, "/").Replace (Path.DirectorySeparatorChar, '/'));
}
- private BuildProvider GetBuildProviderFor (string file, BuildProviderCollection buildProviders)
+ BuildProvider GetBuildProviderFor (string file, BuildProviderCollection buildProviders)
{
if (file == null || file.Length == 0 || buildProviders == null || buildProviders.Count == 0)
return null;
- BuildProvider ret = buildProviders.GetProviderForExtension (Path.GetExtension (file));
+ BuildProvider ret = buildProviders.GetProviderInstanceForExtension (Path.GetExtension (file));
if (ret != null && IsCorrectBuilderType (ret)) {
ret.SetVirtualPath (PhysicalToVirtual (file));
return ret;
return null;
}
- private bool IsCorrectBuilderType (BuildProvider bp)
+ bool IsCorrectBuilderType (BuildProvider bp)
{
if (bp == null)
return false;
internal class AppCodeCompiler
{
- static private bool _alreadyCompiled;
+ static bool _alreadyCompiled;
internal static string DefaultAppCodeAssemblyName;
// A dictionary that contains an entry per an assembly that will
// Files for which exist BuildProviders but which have no
// unambiguous language assigned to them (e.g. .wsdl files), are
// built using the default website compiler.
- private List<AppCodeAssembly> assemblies;
+ List<AppCodeAssembly> assemblies;
string providerTypeName = null;
public AppCodeCompiler ()
bool ProcessAppCodeDir (string appCode, AppCodeAssembly defasm)
{
// First process the codeSubDirectories
- CompilationSection cs = (CompilationSection) WebConfigurationManager.GetSection ("system.web/compilation");
+ CompilationSection cs = (CompilationSection) WebConfigurationManager.GetWebApplicationSection ("system.web/compilation");
if (cs != null) {
string aname;
for (int i = 0; i < cs.CodeSubDirectories.Count; i++) {
- aname = String.Format ("App_SubCode_{0}", cs.CodeSubDirectories[i].DirectoryName);
+ aname = String.Concat ("App_SubCode_", cs.CodeSubDirectories[i].DirectoryName);
assemblies.Add (new AppCodeAssembly (
aname,
Path.Combine (appCode, cs.CodeSubDirectories[i].DirectoryName)));
void GetProfileSettingsSerializeAsAttribute (ProfileSection ps, CodeAttributeDeclarationCollection collection,
SerializationMode mode)
{
- string parameter = String.Format ("SettingsSerializeAs.{0}", mode.ToString ());
+ string parameter = String.Concat ("SettingsSerializeAs.", mode.ToString ());
collection.Add (
new CodeAttributeDeclaration (
"SettingsSerializeAs",
string MakeGroupName (string name)
{
- return String.Format ("ProfileGroup{0}", name);
+ return String.Concat ("ProfileGroup", name);
}
// FIXME: there should be some validation of syntactic correctness of the member/class name
}
string baseType = ps.Inherits;
- bool baseIsGlobal = false;
- if (String.IsNullOrEmpty (baseType)) {
+ if (String.IsNullOrEmpty (baseType))
baseType = "System.Web.Profile.ProfileBase";
- baseIsGlobal = true;
+ else {
+ string[] parts = baseType.Split (new char[] {','});
+ if (parts.Length > 1)
+ baseType = parts [0].Trim ();
}
+ bool baseIsGlobal;
+ if (baseType.IndexOf ('.') != -1)
+ baseIsGlobal = true;
+ else
+ baseIsGlobal = false;
+
BuildProfileClass (ps, "ProfileCommon", props, ns, baseType, baseIsGlobal, groupProperties);
return true;
}
{
if (ps == null || !ps.Enabled)
return false;
- if (!String.IsNullOrEmpty (ps.Inherits) || (ps.PropertySettings != null && ps.PropertySettings.Count > 0))
+
+ RootProfilePropertySettingsCollection props = ps.PropertySettings;
+ ProfileGroupSettingsCollection groups = props != null ? props.GroupSettings : null;
+
+ if (!String.IsNullOrEmpty (ps.Inherits) || (props != null && props.Count > 0) || (groups != null && groups.Count > 0))
return true;
return false;
return;
string appCode = Path.Combine (HttpRuntime.AppDomainAppPath, "App_Code");
- ProfileSection ps = WebConfigurationManager.GetSection ("system.web/profile") as ProfileSection;
+ ProfileSection ps = WebConfigurationManager.GetWebApplicationSection ("system.web/profile") as ProfileSection;
bool haveAppCodeDir = Directory.Exists (appCode);
bool haveCustomProfile = HaveCustomProfile (ps);
if (!haveCode)
return;
-
+
HttpRuntime.EnableAssemblyMapping (true);
string[] binAssemblies = HttpApplication.BinDirectoryAssemblies;
aca.Build (binAssemblies);
_alreadyCompiled = true;
DefaultAppCodeAssemblyName = Path.GetFileNameWithoutExtension (defasm.OutputAssemblyName);
+
+ RunAppInitialize ();
if (haveCustomProfile && providerTypeName != null) {
if (Type.GetType (providerTypeName, false) == null) {
} else
return;
- if (HttpApplication.LoadTypeFromBin (providerTypeName) == null)
- throw new HttpException (String.Format ("Profile provider type not found: {0}",
- providerTypeName));
+ Exception noTypeException = null;
+ Type ptype = null;
+
+ try {
+ ptype = HttpApplication.LoadTypeFromBin (providerTypeName);
+ } catch (Exception ex) {
+ noTypeException = ex;
+ }
+
+ if (ptype == null)
+ throw new HttpException (String.Format ("Profile provider type not found: {0}", providerTypeName), noTypeException);
}
}
- private bool CollectFiles (string dir, AppCodeAssembly aca)
+ // Documented (sort of...) briefly in:
+ //
+ // http://quickstarts.asp.net/QuickStartv20/aspnet/doc/extensibility.aspx
+ // http://msdn2.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider.aspx
+ void RunAppInitialize ()
+ {
+ MethodInfo mi = null, tmi;
+ Type[] types;
+
+ foreach (Assembly asm in BuildManager.CodeAssemblies) {
+ types = asm.GetExportedTypes ();
+ if (types == null || types.Length == 0)
+ continue;
+
+ foreach (Type type in types) {
+ tmi = type.GetMethod ("AppInitialize",
+ BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,
+ null,
+ Type.EmptyTypes,
+ null);
+ if (tmi == null)
+ continue;
+
+ if (mi != null)
+ throw new HttpException ("The static AppInitialize method found in more than one type in the App_Code directory.");
+
+ mi = tmi;
+ }
+ }
+
+ if (mi == null)
+ return;
+
+ mi.Invoke (null, null);
+ }
+
+ bool CollectFiles (string dir, AppCodeAssembly aca)
{
bool haveFiles = false;
}
}
}
-#endif
+