private void ReadILCode()
		{
			NuGenCodeLine start = new NuGenCodeLine();
			start.Text = "{";
			CodeLines.Add(start);

			if (EntryPoint)
			{
				CodeLines.Add(new NuGenCodeLine(1, ".entrypoint"));
			}

			if (Overrides != 0)
			{
				NuGenTokenBase overridenMember = BaseTypeDefinition.ModuleScope.Assembly.AllTokens[Overrides];
				Type overridenMemberType = overridenMember.GetType();
				string memberName;

				if (GenericParameters != null && overridenMember is NuGenIHasSignature)
				{
					NuGenIHasSignature hasSignature = (NuGenIHasSignature)overridenMember;
					hasSignature.SignatureReader.SetGenericParametersOfMethod(GenericParameters);
				}

				if (overridenMemberType == typeof(NuGenMemberReference))
				{
					NuGenMemberReference memberReference = (NuGenMemberReference)overridenMember;
					memberName = memberReference.Text;
				}
				else if (overridenMemberType == typeof(NuGenMethodDefinition))
				{
					NuGenMethodDefinition methodDefinition = (NuGenMethodDefinition)overridenMember;
					memberName = string.Format("{0}::{1}", methodDefinition.BaseTypeDefinition.FullName, methodDefinition.Name);
				}
				else
				{
					throw new NotImplementedException(string.Format("Unhandled overriden member type ('{0}').", overridenMemberType.FullName));
				}

				CodeLines.Add(new NuGenCodeLine(1, ".override method " + memberName));
			}

			if (CustomAttributes != null)
			{
				NuGenAssembly assembly = BaseTypeDefinition.ModuleScope.Assembly;

				foreach (NuGenCustomAttribute customAttribute in CustomAttributes)
				{
					CodeLines.Add(new NuGenCodeLine(1, customAttribute.Name));
				}
			}

			int codeSizePosition = 2;

			if (Parameters != null)
			{
				NuGenAssembly assembly = BaseTypeDefinition.ModuleScope.Assembly;

				try
				{
					assembly.OpenMetadataInterfaces();

					foreach (NuGenParameter parameter in Parameters)
					{
						parameter.LazyInitialize(BaseTypeDefinition.ModuleScope.Assembly.AllTokens);
						bool hasDefault = ((parameter.AttributeFlags & CorParamAttr.pdHasDefault) == CorParamAttr.pdHasDefault);

						if (hasDefault)
						{
							NuGenCodeLine defaultParameter = new NuGenCodeLine();
							defaultParameter.Indentation = 1;
							defaultParameter.Text = parameter.DefaultValueAsString;
							CodeLines.Add(defaultParameter);
							codeSizePosition++;
						}

						if (parameter.CustomAttributes != null)
						{
							if (!hasDefault)
							{
								NuGenCodeLine parameterLine = new NuGenCodeLine(1, string.Format(".param [{0}]", parameter.OrdinalIndex));
								CodeLines.Add(parameterLine);
								codeSizePosition++;
							}

							foreach (NuGenCustomAttribute customAttribute in parameter.CustomAttributes)
							{
								NuGenCodeLine customAttributeLine = new NuGenCodeLine(1, customAttribute.Name);
								CodeLines.Add(customAttributeLine);

								codeSizePosition++;
							}
						}
					}
				}
				finally
				{
					assembly.CloseMetadataInterfaces();
				}
			}

			if (PermissionSets != null)
			{
				foreach (NuGenPermissionSet permissionSet in PermissionSets)
				{
					NuGenCodeLine permissionSetLine = new NuGenCodeLine(1, permissionSet.Name);
					CodeLines.Add(permissionSetLine);

					codeSizePosition++;
				}
			}

			if (((Rva > 0) || BaseTypeDefinition.ModuleScope.Assembly.IsInMemory) && ((ImplementationFlags & CorMethodImpl.miCodeTypeMask) != CorMethodImpl.miNative))
			{
				NuGenAssembly assembly = BaseTypeDefinition.ModuleScope.Assembly;
				BinaryReader assemblyReader = null;

				if (assembly.IsInMemory)
				{
					NuGenInMemoryMethodStream methodStream = new NuGenInMemoryMethodStream(assembly.DebuggedProcess, FindMethodHeader());
					assemblyReader = new BinaryReader(methodStream);
				}
				else
				{
					assembly.OpenAssemblyReader();
					assemblyReader = assembly.AssemblyReader;
					assemblyReader.BaseStream.Position = assembly.GetMethodAddress(Rva);
				}

				byte methodHeader = assemblyReader.ReadByte();
				int methodLength = 0;
				bool moreSects = false;

				if ((methodHeader & (byte)ILMethodHeader.CorILMethod_FatFormat) == (byte)ILMethodHeader.CorILMethod_FatFormat)
				{
					byte methodHeaderByte2 = assemblyReader.ReadByte();
					moreSects = ((methodHeader & (byte)CorILMethodFlags.CorILMethod_MoreSects) == (byte)CorILMethodFlags.CorILMethod_MoreSects);

					byte sizeOfHeader = Convert.ToByte((methodHeaderByte2 >> 4) * 4);
					ushort maxStack = assemblyReader.ReadUInt16();
					methodLength = assemblyReader.ReadInt32();
					uint localVarSigToken = assemblyReader.ReadUInt32();

					NuGenCodeLine maxStackLine = new NuGenCodeLine(1, string.Format(".maxstack {0}", maxStack));
					CodeLines.Add(maxStackLine);

					if (localVarSigToken != 0 && BaseTypeDefinition.ModuleScope.Assembly.StandAloneSignatures != null && BaseTypeDefinition.ModuleScope.Assembly.StandAloneSignatures.ContainsKey(localVarSigToken))
					{
						string initLocals = string.Empty;

						if ((methodHeader & (byte)CorILMethodFlags.CorILMethod_InitLocals) == (byte)CorILMethodFlags.CorILMethod_InitLocals)
						{
							initLocals = "init ";
						}

						NuGenStandAloneSignature standAloneSignature = BaseTypeDefinition.ModuleScope.Assembly.StandAloneSignatures[localVarSigToken];

						if (GenericParameters != null && standAloneSignature.SignatureReader.HasGenericMethodParameter)
						{
							standAloneSignature.SignatureReader.SetGenericParametersOfMethod(GenericParameters);
							standAloneSignature.LazyInitialize(BaseTypeDefinition.ModuleScope.Assembly.AllTokens);
						}

						NuGenCodeLine variablesLine = new NuGenCodeLine(1, string.Format(".locals {0}{1}", initLocals, standAloneSignature.Text));
						CodeLines.Add(variablesLine);
					}
				}
				else if ((methodHeader & (byte)ILMethodHeader.CorILMethod_TinyFormat) == (byte)ILMethodHeader.CorILMethod_TinyFormat)
				{
					methodLength = methodHeader >> 2;
				}

				NuGenCodeLine codeSize = new NuGenCodeLine(1, string.Format("// Code size {0} (0x{1:x})", methodLength, methodLength));

				if (CustomAttributes != null)
				{
					codeSizePosition++;
				}

				if (EntryPoint)
				{
					codeSizePosition++;
				}

				if (Overrides != 0)
				{
					codeSizePosition++;
				}

				CodeLines.Insert(codeSizePosition, codeSize);

				if ((ImplementationFlags & CorMethodImpl.miNative) != CorMethodImpl.miNative)
				{
					byte[] methodCode = new byte[methodLength];
					assemblyReader.Read(methodCode, 0, methodLength);
					int methodCodeIndex = 0;

					while (methodCodeIndex < methodCode.Length)
					{
						int offset = methodCodeIndex;
						short opCodeValue = methodCode[methodCodeIndex++];

						if (opCodeValue == 0xFE)
						{
							opCodeValue = (short)(opCodeValue * 0x100 + methodCode[methodCodeIndex++]);
						}

						if (NuGenOpCodeGroups.OpCodesByValue.ContainsKey(opCodeValue))
						{
							OpCode opCode = NuGenOpCodeGroups.OpCodesByValue[opCodeValue];
							OpCodeGroup opCodeGroup = NuGenOpCodeGroups.GetGroupOfOpCode(opCode);
							int parameterSize = 0;

							switch (opCodeGroup)
							{
								case OpCodeGroup.ByteArgumentParameter:
								case OpCodeGroup.ByteParameter:
								case OpCodeGroup.ByteVariableParameter:
								case OpCodeGroup.SbyteLocationParameter:
								case OpCodeGroup.SbyteParameter:
									parameterSize = 1;
									break;

								case OpCodeGroup.UshortArgumentParameter:
								case OpCodeGroup.UshortParameter:
								case OpCodeGroup.UshortVariableParameter:
									parameterSize = 2;
									break;

								case OpCodeGroup.FloatParameter:
								case OpCodeGroup.FieldParameter:
								case OpCodeGroup.IntLocationParameter:
								case OpCodeGroup.IntParameter:
								case OpCodeGroup.MethodParameter:
								case OpCodeGroup.StringParameter:
								case OpCodeGroup.TypeParameter:
								case OpCodeGroup.Calli:
								case OpCodeGroup.Ldtoken:
								case OpCodeGroup.Switch:
									parameterSize = 4;
									break;

								case OpCodeGroup.DoubleParameter:
								case OpCodeGroup.LongParameter:
									parameterSize = 8;
									break;
							}

							ulong parameter = 0;

							if (parameterSize > 0)
							{
								parameter = NuGenHelperFunctions.GetILCodeParameter(methodCode, methodCodeIndex, parameterSize);
							}

							NuGenBaseILCode code = null;

							switch (opCodeGroup)
							{
								case OpCodeGroup.Parameterless:
									code = new NuGenBaseILCode();
									break;

								case OpCodeGroup.FieldParameter:
									NuGenFieldILCode fieldILCode = new NuGenFieldILCode();
									code = fieldILCode;
									fieldILCode.Parameter = Convert.ToUInt32(parameter);
									fieldILCode.DecodedParameter = assembly.AllTokens[fieldILCode.Parameter];
									if (GenericParameters != null)
									{
										fieldILCode.SetGenericsMethodParameters(assembly.AllTokens, GenericParameters);
									}
									break;

								case OpCodeGroup.MethodParameter:
									NuGenMethodILCode methodILCode = new NuGenMethodILCode();
									code = methodILCode;
									methodILCode.Parameter = Convert.ToUInt32(parameter);
									methodILCode.DecodedParameter = assembly.AllTokens[methodILCode.Parameter];
									if (GenericParameters != null)
									{
										methodILCode.SetGenericsMethodParameters(assembly.AllTokens, GenericParameters);
									}
									break;

								case OpCodeGroup.StringParameter:
									NuGenStringILCode stringILCode = new NuGenStringILCode();
									code = stringILCode;
									stringILCode.Parameter = Convert.ToUInt32(parameter);
									stringILCode.DecodedParameter = assembly.UserStrings[stringILCode.Parameter];
									break;

								case OpCodeGroup.TypeParameter:
									NuGenTypeILCode typeILCode = new NuGenTypeILCode();
									code = typeILCode;
									typeILCode.Parameter = Convert.ToUInt32(parameter);
									typeILCode.DecodedParameter = assembly.AllTokens[typeILCode.Parameter];
									if (GenericParameters != null)
									{
										typeILCode.SetGenericsMethodParameters(assembly.AllTokens, GenericParameters);
									}
									break;

								case OpCodeGroup.IntLocationParameter:
									LocationILCode<int> intLocationILCode = new LocationILCode<int>();
									code = intLocationILCode;
									intLocationILCode.Parameter = (int)parameter;
									intLocationILCode.DecodedParameter = intLocationILCode.Parameter;
									break;

								case OpCodeGroup.SbyteLocationParameter:
									LocationILCode<sbyte> sbyteLocationILCode = new LocationILCode<sbyte>();
									code = sbyteLocationILCode;
									sbyteLocationILCode.Parameter = (sbyte)parameter;
									sbyteLocationILCode.DecodedParameter = sbyteLocationILCode.Parameter;
									break;

								case OpCodeGroup.ByteParameter:
									NumberILCode<byte> byteNumberILCode = new NumberILCode<byte>();
									code = byteNumberILCode;
									byteNumberILCode.Parameter = (byte)parameter;
									byteNumberILCode.DecodedParameter = byteNumberILCode.Parameter;
									break;

								case OpCodeGroup.UshortParameter:
									NumberILCode<ushort> ushortNumberILCode = new NumberILCode<ushort>();
									code = ushortNumberILCode;
									ushortNumberILCode.Parameter = (ushort)parameter;
									ushortNumberILCode.DecodedParameter = ushortNumberILCode.Parameter;
									break;

								case OpCodeGroup.SbyteParameter:
									NumberILCode<sbyte> sbyteNumberILCode = new NumberILCode<sbyte>();
									code = sbyteNumberILCode;
									sbyteNumberILCode.Parameter = (sbyte)parameter;
									sbyteNumberILCode.DecodedParameter = sbyteNumberILCode.Parameter;
									break;

								case OpCodeGroup.IntParameter:
									NumberILCode<int> intNumberILCode = new NumberILCode<int>();
									code = intNumberILCode;
									intNumberILCode.Parameter = (int)parameter;
									intNumberILCode.DecodedParameter = intNumberILCode.Parameter;
									break;

								case OpCodeGroup.LongParameter:
									NumberILCode<long> longNumberILCode = new NumberILCode<long>();
									code = longNumberILCode;
									longNumberILCode.Parameter = (long)parameter;
									longNumberILCode.DecodedParameter = longNumberILCode.Parameter;
									break;

								case OpCodeGroup.FloatParameter:
									NumberILCode<float> floatNumberILCode = new NumberILCode<float>();
									code = floatNumberILCode;
									floatNumberILCode.Parameter = NuGenHelperFunctions.ConvertToSingle(parameter);
									floatNumberILCode.DecodedParameter = floatNumberILCode.Parameter;
									break;

								case OpCodeGroup.DoubleParameter:
									NumberILCode<double> doubleNumberILCode = new NumberILCode<double>();
									code = doubleNumberILCode;
									doubleNumberILCode.Parameter = NuGenHelperFunctions.ConvertToDouble(parameter);
									doubleNumberILCode.DecodedParameter = doubleNumberILCode.Parameter;
									break;

								case OpCodeGroup.ByteArgumentParameter:
									ArgumentILCode<byte> byteArgumentILCode = new ArgumentILCode<byte>();
									code = byteArgumentILCode;
									byteArgumentILCode.Parameter = (byte)parameter;
									byteArgumentILCode.DecodedParameter = NameOfParameter(parameter);
									break;

								case OpCodeGroup.UshortArgumentParameter:
									ArgumentILCode<ushort> ushortArgumentILCode = new ArgumentILCode<ushort>();
									code = ushortArgumentILCode;
									ushortArgumentILCode.Parameter = (ushort)parameter;
									ushortArgumentILCode.DecodedParameter = NameOfParameter(parameter);
									break;

								case OpCodeGroup.ByteVariableParameter:
									VariableILCode<byte> byteVariableILCode = new VariableILCode<byte>();
									code = byteVariableILCode;
									byteVariableILCode.Parameter = (byte)parameter;
									byteVariableILCode.DecodedParameter = byteVariableILCode.Parameter;
									break;

								case OpCodeGroup.UshortVariableParameter:
									VariableILCode<ushort> ushortVariableILCode = new VariableILCode<ushort>();
									code = ushortVariableILCode;
									ushortVariableILCode.Parameter = (ushort)parameter;
									ushortVariableILCode.DecodedParameter = ushortVariableILCode.Parameter;
									break;

								case OpCodeGroup.Calli:
									NuGenCalliILCode calliILCode = new NuGenCalliILCode();
									code = calliILCode;
									calliILCode.Parameter = Convert.ToUInt32(parameter);
									calliILCode.DecodedParameter = assembly.StandAloneSignatures[calliILCode.Parameter];
									break;

								case OpCodeGroup.Ldtoken:
									NuGenLdtokenILCode ldtokenILCode = new NuGenLdtokenILCode();
									code = ldtokenILCode;
									ldtokenILCode.Parameter = Convert.ToUInt32(parameter);
									ldtokenILCode.DecodedParameter = assembly.AllTokens[ldtokenILCode.Parameter];

									if (GenericParameters != null)
									{
										ldtokenILCode.SetGenericsMethodParameters(assembly.AllTokens, GenericParameters);
									}
									break;

								case OpCodeGroup.Switch:
									NuGenSwitchILCode switchILCode = new NuGenSwitchILCode();
									code = switchILCode;
									ulong addressIndex = 0;
									switchILCode.Parameter = new int[parameter];
									parameterSize += Convert.ToInt32(parameter * 4);

									while (addressIndex < parameter)
									{
										int jumpAddress = (int)NuGenHelperFunctions.GetILCodeParameter(methodCode, methodCodeIndex + Convert.ToInt32((addressIndex + 1) * 4), 4);
										switchILCode.Parameter[addressIndex++] = jumpAddress;
									}
									break;
							}

							if (code != null)
							{
								code.Offset = offset;
								code.OpCode = opCode;
								code.DecodeParameter();
							}

							code.Indentation = 1;

							CodeLines.Add(code);
							methodCodeIndex += parameterSize;
						}
					}

					NuGenCodeLine end = new NuGenCodeLine();
					StringBuilder endText = new StringBuilder();
					endText.Append("} //end of method ");

					if (BaseTypeDefinition.FullName != null && BaseTypeDefinition.FullName.Length > 0)
					{
						endText.Append(BaseTypeDefinition.FullName);
						endText.Append("::");
					}

					endText.Append(Name);
					end.Text = endText.ToString();

					CodeLines.Add(end);

					if (moreSects)
					{
						ReadMethodDataSections(assemblyReader);
					}
				}

				if (assembly.IsInMemory)
				{
					assemblyReader.Close();
				}
				else
				{
					assembly.CloseAssemblyReader();
				}
			}
			else
			{
				NuGenCodeLine end = new NuGenCodeLine();
				end.Text = string.Format("}} // end of method {0}{1}{2}", BaseTypeDefinition.Name, (BaseTypeDefinition.Name.Length > 0 ? "::" : string.Empty), Name);
				CodeLines.Add(end);
			}
		}
示例#2
0
		public void Initialize()
		{
			ReadMetadata();
			NuGenAssembly assembly = BaseTypeDefinition.ModuleScope.Assembly;
			CodeLines = new List<NuGenCodeLine>();
			NuGenCodeLine definitionLine = new NuGenCodeLine();
			definitionLine.Indentation = 0;

			CodeLines.Add(definitionLine);
			CodeLines.Add(new NuGenCodeLine(0, "{"));

			if (CustomAttributes != null)
			{
				foreach (NuGenCustomAttribute customAttribute in CustomAttributes)
				{
					customAttribute.SetText(assembly.AllTokens);
					CodeLines.Add(new NuGenCodeLine(1, customAttribute.Name));
				}
			}

			if (assembly.AllTokens.ContainsKey(GetterMethodToken))
			{
				NuGenMethodDefinition getMethod = (NuGenMethodDefinition)assembly.AllTokens[GetterMethodToken];
				CodeLines.Add(new NuGenCodeLine(1, ".get " + getMethod.Text));
			}

			for (int index = 0; index < OtherMethodsCount; index++)
			{
				uint token = OtherMethods[index];

				if (assembly.AllTokens.ContainsKey(token))
				{
					NuGenMethodDefinition otherMethod = (NuGenMethodDefinition)assembly.AllTokens[token];
					CodeLines.Add(new NuGenCodeLine(1, ".other " + otherMethod.Text));
				}
			}

			if (assembly.AllTokens.ContainsKey(SetterMethodToken))
			{
				NuGenMethodDefinition setMethod = (NuGenMethodDefinition)assembly.AllTokens[setterMethodToken];
				CodeLines.Add(new NuGenCodeLine(1, ".set " + setMethod.Text));
			}

			Definition = ".property " + Definition;
			definitionLine.Text = Definition;

			CodeLines.Add(new NuGenCodeLine(0, string.Format("}} //end of property {0}::{1}", BaseTypeDefinition.Name, Name)));
		}
		private void AddExceptionCodeLines(uint offset, uint length, string name, string endComment, bool finallyClause)
		{
			int start = FindCodeLine(offset);

			if (start > -1)
			{
				int end = FindCodeLine(offset + length);

				if (end > -1)
				{
					int indentation = ((NuGenBaseILCode)CodeLines[start]).Indentation;

					for (int ilCodeIndex = start; ilCodeIndex < end; ilCodeIndex++)
					{
						CodeLines[ilCodeIndex].Indentation++;
					}

					NuGenCodeLine nameDefinition = new NuGenCodeLine(indentation, name);
					NuGenCodeLine bracket = new NuGenCodeLine(indentation, "{");

					CodeLines.Insert(start, bracket);
					CodeLines.Insert(start, nameDefinition);

					end += 2;
					if (finallyClause && indentation > 1)
					{
						indentation--;
					}
					bracket = new NuGenCodeLine(indentation, string.Format("}} {0}", endComment));
					CodeLines.Insert(end, bracket);
				}
			}
		}
		private NuGenCodeLine CreateMethodHead(string definition)
		{
			NuGenCodeLine result = new NuGenCodeLine();
			StringBuilder text = new StringBuilder();

			text.Append(".method ");
			NuGenHelperFunctions.AddWordToStringBuilder(text, MemberAccessAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, MethodContractAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, VTableLayoutAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, MethodImplementationAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, InteropAttributesAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, ReservedFlagsAsString());
			text.Append(definition);
			NuGenHelperFunctions.AddWordToStringBuilder(text, CodeImplementationAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, ManagedImplementationAsString());
			NuGenHelperFunctions.AddWordToStringBuilder(text, ImplementationInfoAsString());

			result.Text = text.ToString();

			return result;
		}
示例#5
0
		public void Initialize()
		{
			CodeLines = new List<NuGenCodeLine>();

			NuGenCodeLine definition = new NuGenCodeLine(0, "file " + Name);
			CodeLines.Add(definition);

			CodeLines.Add(new NuGenCodeLine(0, string.Format(".hash = {0}", NuGenHelperFunctions.ReadBlobAsString(Hash, HashLength))));
		}
		public void Initialize()
		{
			CodeLines = new List<NuGenCodeLine>();

			StringBuilder definitionBuilder = new StringBuilder(".mresource ");
			
			if ((Flags & CorManifestResourceFlags.mrPublic) == CorManifestResourceFlags.mrPublic)
			{
				definitionBuilder.Append("public ");
			}
			else
			{
				definitionBuilder.Append("private ");
			}

			definitionBuilder.Append(Name);

			NuGenCodeLine definition = new NuGenCodeLine(0, definitionBuilder.ToString());
			CodeLines.Add(definition);

			CodeLines.Add(new NuGenCodeLine(0, "{"));

			CodeLines.Add(new NuGenCodeLine(1, string.Format(".file {0} at 0x{1}", Name, NuGenHelperFunctions.FormatAsHexNumber(Offset, 8))));

			CodeLines.Add(new NuGenCodeLine(0, "}"));
		}
		public void Initialize()
		{
			CodeLines = new List<NuGenCodeLine>();

			StringBuilder definition = new StringBuilder();
			definition.Append(".assembly extern ");
			definition.Append(NuGenHelperFunctions.EnumAsString(Flags, CorAssemblyFlags.afRetargetable, "retargetable "));
			definition.Append(Name);

			NuGenCodeLine definitionLine = new NuGenCodeLine(0, definition.ToString());
			CodeLines.Add(definitionLine);

			CodeLines.Add(new NuGenCodeLine(0, "{"));

			if (FullPath != null && FullPath.Length > 0)
			{
				CodeLines.Add(new NuGenCodeLine(1, "//Full Path: " + FullPath));
			}
			else
			{
				CodeLines.Add(new NuGenCodeLine(1, "//Full Path: exact location not found. "));
			}

			CodeLines.Add(new NuGenCodeLine(1, ".publickeytoken = " + NuGenHelperFunctions.ReadBlobAsString(PublicKeyOrToken, PublicKeyOrTokenLength)));

			if (HashBlobLength > 0)
			{
				CodeLines.Add(new NuGenCodeLine(1, ".hash = " + NuGenHelperFunctions.ReadBlobAsString(HashBlob, HashBlobLength)));
			}

			CodeLines.Add(new NuGenCodeLine(1, string.Format(".ver {0}:{1}:{2}:{3}", Metadata.usMajorVersion, Metadata.usMinorVersion, Metadata.usBuildNumber, Metadata.usRevisionNumber)));

			CodeLines.Add(new NuGenCodeLine(0, "} //end of assembly reference " + Name));
		}