\r
public AspComponent MakeAspComponent (string foundryName, string componentName, Tag tag)\r
{\r
- InternalFoundry foundry = foundries [foundryName] as InternalFoundry;\r
+ Foundry foundry = foundries [foundryName] as Foundry;\r
if (foundry == null)\r
throw new ApplicationException ("Foundry not found: " + foundryName);\r
\r
string assemblyName,\r
string nameSpace)\r
{\r
- InternalFoundry foundry = new InternalFoundry (assemblyName, nameSpace, null);\r
- foundries.Add (foundryName, foundry);\r
+ AssemblyFoundry foundry = new AssemblyFoundry (assemblyName, nameSpace);\r
+ InternalRegister (foundryName, foundry);\r
}\r
\r
public void RegisterFoundry (string foundryName,\r
+ string tagName,\r
string assemblyName,\r
string nameSpace,\r
string typeName)\r
{\r
- InternalFoundry foundry = new InternalFoundry (assemblyName, nameSpace, typeName);\r
- foundries.Add (foundryName, foundry);\r
+ TagNameFoundry foundry = new TagNameFoundry (assemblyName, tagName, nameSpace, typeName);\r
+ InternalRegister (foundryName, foundry);\r
+ }\r
+\r
+ void InternalRegister (string foundryName, Foundry foundry)\r
+ {\r
+ object f = foundries [foundryName];\r
+ if (f is CompoundFoundry) {\r
+ ((CompoundFoundry) f).Add (foundry);\r
+ } else if (f == null || (f is AssemblyFoundry && foundry is AssemblyFoundry)) {\r
+ // If more than 1 namespace/assembly specified, the last one is used.\r
+ foundries [foundryName] = foundry;\r
+ } else if (f != null) {\r
+ CompoundFoundry compound = new CompoundFoundry (foundryName);\r
+ compound.Add ((Foundry) f);\r
+ compound.Add (foundry);\r
+ foundries [foundryName] = compound;\r
+ }\r
}\r
\r
public bool LookupFoundry (string foundryName)\r
return foundries.Contains (foundryName);\r
}\r
\r
- class InternalFoundry\r
+ abstract class Foundry\r
+ {\r
+ public abstract Type GetType (string componentName);\r
+\r
+ public Assembly LoadAssembly (string assemblyName)\r
+ {\r
+ Assembly assembly = null;\r
+ try {\r
+ assembly = Assembly.LoadFrom (Path.GetFullPath (assemblyName));\r
+ } catch {\r
+ string partialName = assemblyName;\r
+ if (String.Compare (Path.GetExtension (partialName), ".dll", true) == 0)\r
+ partialName = Path.GetFileNameWithoutExtension (assemblyName);\r
+\r
+ assembly = Assembly.LoadWithPartialName (partialName);\r
+ }\r
+\r
+ if (assembly == null)\r
+ throw new ApplicationException ("Assembly not found:" + assemblyName);\r
+\r
+ return assembly;\r
+ }\r
+ }\r
+ \r
+\r
+ class TagNameFoundry : Foundry\r
{\r
- string nameSpace;\r
string assemblyName;\r
+ string tagName;\r
+ string nameSpace;\r
string typeName;\r
- Assembly assembly;\r
+ Type type;\r
\r
- public InternalFoundry (string assemblyName, string nameSpace, string typeName)\r
+ public TagNameFoundry (string assemblyName, string tagName, string nameSpace, string typeName)\r
{\r
this.assemblyName = assemblyName;\r
+ this.tagName = tagName;\r
this.nameSpace = nameSpace;\r
this.typeName = typeName;\r
- assembly = null;\r
}\r
\r
- public Type GetType (string componentName)\r
+ public override Type GetType (string componentName)\r
{\r
- EnsureAssembly ();\r
+ if (0 != String.Compare (componentName, tagName, true))\r
+ throw new ArgumentException (componentName + " != " + tagName);\r
+ \r
+ if (type != null)\r
+ return type;\r
+ \r
+ Assembly assembly = LoadAssembly (assemblyName);\r
+ type = assembly.GetType (nameSpace + "." + typeName, true, true);\r
+ return type;\r
+ }\r
\r
- // For ascx files\r
- if (typeName != null && 0 == String.Compare (componentName, typeName, true)) {\r
- throw new ApplicationException ("Only type '" + typeName + "' allowed.");\r
- } else if (typeName != null) {\r
- componentName = typeName;\r
- }\r
+ public string TagName {\r
+ get { return tagName; }\r
+ }\r
+ }\r
+\r
+ class AssemblyFoundry : Foundry\r
+ {\r
+ string nameSpace;\r
+ string assemblyName;\r
+ Assembly assembly;\r
+\r
+ public AssemblyFoundry (string assemblyName, string nameSpace)\r
+ {\r
+ this.assemblyName = assemblyName;\r
+ this.nameSpace = nameSpace;\r
+ assembly = null;\r
+ }\r
+\r
+ public override Type GetType (string componentName)\r
+ {\r
+ Assembly ass = EnsureAssembly (componentName);\r
\r
- return assembly.GetType (nameSpace + "." + componentName, true, true);\r
+ return ass.GetType (nameSpace + "." + componentName, true, true);\r
}\r
\r
- private void EnsureAssembly ()\r
+ Assembly EnsureAssembly (string componentName)\r
{\r
if (assembly != null)\r
+ return assembly;\r
+\r
+ assembly = LoadAssembly (assemblyName);\r
+ return assembly;\r
+ }\r
+ }\r
+\r
+ class CompoundFoundry : Foundry\r
+ {\r
+ AssemblyFoundry assemblyFoundry;\r
+ Hashtable tagnames;\r
+ string tagPrefix;\r
+\r
+ public CompoundFoundry (string tagPrefix)\r
+ {\r
+ this.tagPrefix = tagPrefix;\r
+ tagnames = new Hashtable (CaseInsensitiveHashCodeProvider.Default,\r
+ CaseInsensitiveComparer.Default);\r
+ }\r
+\r
+ public void Add (Foundry foundry)\r
+ {\r
+ if (foundry is AssemblyFoundry) {\r
+ assemblyFoundry = (AssemblyFoundry) foundry;\r
return;\r
+ }\r
+ \r
+ TagNameFoundry tn = (TagNameFoundry) foundry;\r
+ string tagName = tn.TagName;\r
+ if (tagnames.Contains (tagName)) {\r
+ string msg = String.Format ("{0}:{1} already registered.", tagPrefix, tagName);\r
+ throw new ApplicationException (msg);\r
+ }\r
+ tagnames.Add (tagName, foundry);\r
+ }\r
\r
- try {\r
- assembly = Assembly.LoadFrom (Path.GetFullPath (assemblyName));\r
- } catch {\r
- assembly = Assembly.LoadWithPartialName (assemblyName);\r
+ public override Type GetType (string componentName)\r
+ {\r
+ Type type = null;\r
+ if (assemblyFoundry != null) {\r
+ try {\r
+ type = assemblyFoundry.GetType (componentName);\r
+ return type;\r
+ } catch { }\r
}\r
\r
- if (assembly == null)\r
- throw new ApplicationException ("Assembly not found:" + assemblyName);\r
+ Foundry foundry = tagnames [componentName] as Foundry;\r
+ if (foundry == null) {\r
+ string msg = String.Format ("Type {0} not registered for prefix {1}",\r
+ componentName, tagPrefix);\r
+ throw new ApplicationException (msg);\r
+ }\r
+\r
+ return foundry.GetType (componentName);\r
}\r
}\r
-\r
}\r
}\r
\r
set { context = value; }
}
+ bool AddUsing (string nspace)
+ {
+ string _using = "using " + nspace + ";";
+ if (prolog.ToString ().IndexOf (_using) == -1) {
+ prolog.AppendFormat ("\t{0}\n", _using);
+ return true;
+ }
+
+ return false;
+ }
+
void AddInterface (Type type)
{
AddInterface (type.ToString ());
if (tag_name != "" || src != "")
throw new ApplicationException ("Invalid attributes for @ Register: " +
att.ToString ());
- prolog.AppendFormat ("\tusing {0};\n", name_space);
+
+ AddUsing (name_space);
string dll = privateBinPath + Path.DirectorySeparatorChar + assembly_name + ".dll";
+ // Hack: it should use assembly.load semantics...
+ // may be when we don't run mcs as a external program...
+ if (!File.Exists (dll))
+ dll = assembly_name;
+
Foundry.RegisterFoundry (tag_prefix, dll, name_space);
AddReference (dll);
return;
UserControlData data = GenerateUserControl (src, Context);
switch (data.result) {
case UserControlResult.OK:
- prolog.AppendFormat ("\tusing {0};\n", "ASP");
+ AddUsing ("ASP");
string dll = "output" + Path.DirectorySeparatorChar + data.assemblyName + ".dll";
- Foundry.RegisterFoundry (tag_prefix, data.assemblyName, "ASP", data.className);
+ Foundry.RegisterFoundry (tag_prefix, tag_name, data.assemblyName, "ASP", data.className);
AddReference (data.assemblyName);
break;
case UserControlResult.FileNotFound:
throw new ApplicationException ("Wrong syntax in Import directive.");
string _using = "using " + value + ";";
- if (prolog.ToString ().IndexOf (_using) == -1) {
- prolog.AppendFormat ("\t{0}\n", _using);
+ if (AddUsing (value) == true) {
string imports = Options ["Import"] as string;
if (imports == null) {
imports = value;