| 1: | // -------------------------------------------------------------------------- | |
| 2: | // (c) Copyright Bill Dawson 2002 | |
| 3: | // http://www.BillDawson.com | |
| 4: | // | |
| 5: | // You are free to use this source code in your projects. Please leave | |
| 6: | // this copyright message intact. | |
| 7: | // -------------------------------------------------------------------------- | |
| 8: | ||
| 9: | ||
| 10: | // created on 12/19/2002 at 11:08 AM | |
| 11: | using System; | |
| 12: | using System.Reflection; | |
| 13: | using System.CodeDom; | |
| 14: | using System.CodeDom.Compiler; | |
| 15: | using Microsoft.CSharp; | |
| 16: | using Microsoft.JScript; | |
| 17: | using Microsoft.VisualBasic; | |
| 18: | using System.IO; | |
| 19: | using com.billdawson.dotnet.utils; | |
| 20: | ||
| 21: | namespace com.billdawson.dotnet.utils | |
| 22: | { | |
| 23: | public class TheMain | |
| 24: | { | |
| 25: | public static void Main(string[] args) | |
| 26: | { | |
| 27: | CommandLineArgs cla = new CommandLineArgs(args); | |
| 28: | System.Collections.Hashtable argsTable=null; | |
| 29: | ||
| 30: | cla.AddRequiredArg("/l"); | |
| 31: | cla.AddRequiredArg("/t"); | |
| 32: | cla.AddRequiredArg("/a"); | |
| 33: | cla.AddValueArg("/l"); | |
| 34: | cla.AddValueArg("/t"); | |
| 35: | cla.AddValueArg("/a"); | |
| 36: | cla.AddValueArg("/o"); | |
| 37: | cla.AddValueArg("/n"); | |
| 38: | ||
| 39: | try { | |
| 40: | argsTable = cla.Parse(); | |
| 41: | } catch ( RequiredArgumentException e ) { | |
| 42: | showUsage(); | |
| 43: | Console.WriteLine("Required argument {0} missing.", e.ArgName ); | |
| 44: | return; | |
| 45: | } catch ( ArgumentDependencyException e ) { | |
| 46: | showUsage(); | |
| 47: | Console.WriteLine("Argument {0} requires argument {1} be specified.", | |
| 48: | e.Dependent, e.Dependee); | |
| 49: | return; | |
| 50: | } catch ( ArgumentExclusivityException e) { | |
| 51: | showUsage(); | |
| 52: | Console.WriteLine("Arguments {0} and {1} cannot be used together.", e.Arg1 , e.Arg2); | |
| 53: | return; | |
| 54: | } catch ( ArgCannotHaveValueException e) { | |
| 55: | showUsage(); | |
| 56: | Console.WriteLine("Argument {0} not understood. Cannot have associated value.", e.ArgName ); | |
| 57: | return; | |
| 58: | } catch ( ArgMustHaveValueException e) { | |
| 59: | showUsage(); | |
| 60: | Console.WriteLine("Argument {0} not understood. Must specify value.", e.ArgName ); | |
| 61: | return; | |
| 62: | } catch (Exception e) { | |
| 63: | showUsage(); | |
| 64: | Console.WriteLine("Unexpected Exception: " + e.Message); | |
| 65: | return; | |
| 66: | } | |
| 67: | ||
| 68: | string language = ((string)argsTable["/l"]).ToLower(); | |
| 69: | string outfile = String.Empty; | |
| 70: | string typename =(string) argsTable["/t"]; | |
| 71: | string codebase = (string)argsTable["/a"]; | |
| 72: | string ns = "defaultNamespace"; | |
| 73: | ||
| 74: | if (argsTable.ContainsKey("/o")) | |
| 75: | outfile = (string)argsTable["/o"]; | |
| 76: | ||
| 77: | if (argsTable.ContainsKey("/n")) | |
| 78: | ns = (string)argsTable["/n"]; | |
| 79: | ||
| 80: | AssemblyName aname = new AssemblyName(); | |
| 81: | aname.CodeBase = codebase; | |
| 82: | Assembly assembly = null; | |
| 83: | ||
| 84: | try { | |
| 85: | assembly = Assembly.Load(aname); | |
| 86: | } catch(Exception e) { | |
| 87: | Console.WriteLine("Unable to load assembly you specified as {0}. {1}",aname,e.Message); | |
| 88: | return; | |
| 89: | } | |
| 90: | ||
| 91: | Type[] types = null; | |
| 92: | ||
| 93: | if (typename=="*") | |
| 94: | types = assembly.GetTypes(); | |
| 95: | else { | |
| 96: | Type singletype = assembly.GetType(typename); | |
| 97: | if (singletype==null) | |
| 98: | throw new UnknownTypeException(typename); | |
| 99: | types = new Type[1]; | |
| 100: | types[0]=singletype; | |
| 101: | ||
| 102: | } | |
| 103: | ||
| 104: | ||
| 105: | CodeDomProvider provider; | |
| 106: | ||
| 107: | switch(language){ | |
| 108: | case "vb": | |
| 109: | provider = new VBCodeProvider(); | |
| 110: | break; | |
| 111: | case "c#": | |
| 112: | provider = new CSharpCodeProvider(); | |
| 113: | break; | |
| 114: | case "js": | |
| 115: | provider = new JScriptCodeProvider(); | |
| 116: | break; | |
| 117: | default: | |
| 118: | throw new UnknownLanguageException(language); | |
| 119: | } | |
| 120: | ||
| 121: | TextWriter tw; | |
| 122: | ||
| 123: | if (outfile!=String.Empty) | |
| 124: | tw = new StreamWriter(new FileStream(outfile, FileMode.Create)); | |
| 125: | else | |
| 126: | tw = Console.Out; | |
| 127: | ||
| 128: | foreach(Type type in types) | |
| 129: | { | |
| 130: | try{ | |
| 131: | Field2PropWrap.Wrap(type, ns, provider, tw); | |
| 132: | } catch(TypeHasNoPublicFieldsException e){ | |
| 133: | Console.Error.WriteLine("Note that type {0} had no public fields to transform.", e.TypeName); | |
| 134: | } | |
| 135: | } | |
| 136: | ||
| 137: | tw.Close(); | |
| 138: | ||
| 139: | if (outfile!=String.Empty) | |
| 140: | Console.WriteLine("Completed output to {0}",outfile ); | |
| 141: | ||
| 142: | } | |
| 143: | ||
| 144: | private static void showUsage() | |
| 145: | { | |
| 146: | Assembly thisAssembly = Assembly.GetExecutingAssembly(); | |
| 147: | System.Text.StringBuilder sb = new System.Text.StringBuilder(); | |
| 148: | ||
| 149: | sb.Append("\nUSAGE:\n\n>> "); | |
| 150: | sb.Append(getFileNameFromCodeBase(thisAssembly.CodeBase)); | |
| 151: | sb.Append(" [options]\n\n"); | |
| 152: | sb.Append(" Options:\n\n"); | |
| 153: | sb.Append(" /l:[language] [language] = c#,vb or js\n"); | |
| 154: | sb.Append(" /a:[assembly] [assembly] = path to assembly file containing type\n"); | |
| 155: | sb.Append(" /t:[typename] [typename] = original typename (use * to transform all)\n"); | |
| 156: | sb.Append(" /n:[namespace] [namespace] = namspace for the NEW type\n"); | |
| 157: | sb.Append(" /o:[outputfile] [outputfile] = valid file name\n"); | |
| 158: | sb.Append("\n\n"); | |
| 159: | sb.Append("The /o option is optional. If omitted, output goes to screen.\n\n"); | |
| 160: | sb.Append("Example:\n\n"); | |
| 161: | sb.Append(">> " + getFileNameFromCodeBase(thisAssembly.CodeBase)); | |
| 162: | sb.Append(" /l:c# /t:OldNamespace.OldType /a:MyAssembly.dll /n:NewNamespace /o:NewFile.cs"); | |
| 163: | sb.Append("\n\n"); | |
| 164: | ||
| 165: | Console.WriteLine(sb.ToString()); | |
| 166: | } | |
| 167: | ||
| 168: | private static string getFileNameFromCodeBase(string uri) | |
| 169: | { | |
| 170: | int lastslash = uri.LastIndexOf("/"); | |
| 171: | if (lastslash<1) | |
| 172: | return uri; | |
| 173: | else{ | |
| 174: | string shorter = uri.Substring(lastslash + 1); | |
| 175: | int lastdot = shorter.LastIndexOf("."); | |
| 176: | return shorter.Substring(0,lastdot); | |
| 177: | ||
| 178: | } | |
| 179: | ||
| 180: | ||
| 181: | } | |
| 182: | } | |
| 183: | ||
| 184: | public class UnknownLanguageException : Exception | |
| 185: | { | |
| 186: | private string _language=""; | |
| 187: | ||
| 188: | public UnknownLanguageException(string language) | |
| 189: | { | |
| 190: | _language = language; | |
| 191: | } | |
| 192: | ||
| 193: | public string LanguageName | |
| 194: | { | |
| 195: | get{ return _language; } | |
| 196: | set{ _language = value; } | |
| 197: | } | |
| 198: | } | |
| 199: | ||
| 200: | ||
| 201: | ||
| 202: | public class UnknownTypeException : Exception | |
| 203: | { | |
| 204: | private string _typeName = ""; | |
| 205: | ||
| 206: | public UnknownTypeException(string typeName) | |
| 207: | { | |
| 208: | _typeName = typeName; | |
| 209: | } | |
| 210: | ||
| 211: | public string TypeName{ | |
| 212: | get{ return _typeName; } | |
| 213: | set{ _typeName=value; } | |
| 214: | } | |
| 215: | } | |
| 216: | ||
| 217: | public class TypeHasNoPublicFieldsException : Exception | |
| 218: | { | |
| 219: | private string _typeName = ""; | |
| 220: | ||
| 221: | public TypeHasNoPublicFieldsException(string typeName) | |
| 222: | { | |
| 223: | _typeName = typeName; | |
| 224: | } | |
| 225: | ||
| 226: | public string TypeName{ | |
| 227: | get{ return _typeName; } | |
| 228: | set{ _typeName=value; } | |
| 229: | } | |
| 230: | } | |
| 231: | } |
This page was automatically generated by SharpDevelop.