/// <summary> /// override for mapping instructions between clr and xml namespaces /// </summary> public override void WritePIMapping(XamlPIMappingNode xamlPIMappingNode) { if (!_pass2) { _compiler.AddUsing(xamlPIMappingNode.ClrNamespace); } // Local assembly! if ((xamlPIMappingNode.AssemblyName == null) || (xamlPIMappingNode.AssemblyName.Length == 0)) { xamlPIMappingNode.AssemblyName = _compiler.AssemblyName; bool addMapping = !XamlTypeMapper.PITable.Contains(xamlPIMappingNode.XmlNamespace) || ((ClrNamespaceAssemblyPair)XamlTypeMapper.PITable[xamlPIMappingNode.XmlNamespace]).LocalAssembly || string.IsNullOrEmpty(((ClrNamespaceAssemblyPair)XamlTypeMapper.PITable[xamlPIMappingNode.XmlNamespace]).AssemblyName); if (addMapping) { ClrNamespaceAssemblyPair namespaceMapping = new ClrNamespaceAssemblyPair(xamlPIMappingNode.ClrNamespace, xamlPIMappingNode.AssemblyName); namespaceMapping.LocalAssembly = true; XamlTypeMapper.PITable[xamlPIMappingNode.XmlNamespace] = namespaceMapping; XamlTypeMapper.InvalidateMappingCache(xamlPIMappingNode.XmlNamespace); if (!_pass2 && BamlRecordWriter != null) { BamlRecordWriter = null; } } } base.WritePIMapping(xamlPIMappingNode); }
/// <summary> /// Xml - Clr namespace mapping /// </summary> public virtual void WritePIMapping(XamlPIMappingNode xamlPIMappingNode) { // The only case when the assembly name can be empty is when there is a local assembly // specified in the Mapping PI, but the compiler extension should have resolved it by // now. So if we are still seeing an empty string here that means we in the pure xaml // parsing scenario and should throw. if (xamlPIMappingNode.AssemblyName.Length == 0) { ThrowException(SRID.ParserMapPIMissingKey, xamlPIMappingNode.LineNumber, xamlPIMappingNode.LinePosition); } if (BamlRecordWriter != null) { BamlRecordWriter.WritePIMapping(xamlPIMappingNode); } }
// Write a xml to clr namespace mapping record internal void WritePIMapping(XamlPIMappingNode xamlPIMappingNode) { BamlPIMappingRecord piMappingRecord = (BamlPIMappingRecord) BamlRecordManager.GetWriteRecord(BamlRecordType.PIMapping); BamlAssemblyInfoRecord bamlAssemblyInfoRecord = MapTable.AddAssemblyMap(BinaryWriter, xamlPIMappingNode.AssemblyName); piMappingRecord.XmlNamespace = xamlPIMappingNode.XmlNamespace; piMappingRecord.ClrNamespace = xamlPIMappingNode.ClrNamespace; piMappingRecord.AssemblyId = bamlAssemblyInfoRecord.AssemblyId; WriteBamlRecord(piMappingRecord, xamlPIMappingNode.LineNumber, xamlPIMappingNode.LinePosition); BamlRecordManager.ReleaseWriteRecord(piMappingRecord); }