public override void CopyResources(string src, string dest) { AssemblyDefinition srcAD = AssemblyDefinition.ReadAssembly(src); AssemblyDefinition dstAD = AssemblyDefinition.ReadAssembly(dest); string srcName = srcAD.Name.Name; string dstName = dstAD.Name.Name; if (string.IsNullOrWhiteSpace(m_resourceNamePattern)) { // Replace the 1st-level resources Debug.Assert(string.Equals(m_srcResourcesFilename, m_dstResourcesFilename, StringComparison.OrdinalIgnoreCase)); Debug.Assert(!string.IsNullOrWhiteSpace(m_srcResourcesFilename)); m_srcResourcesFilename = m_srcResourcesFilename.Replace("[an]", srcName); foreach (EmbeddedResource srcRes in srcAD.MainModule.Resources.OfType <EmbeddedResource>()) { if (MatchWildcards(m_srcResourcesFilename, srcRes.Name)) { string dstResName = srcRes.Name.Replace(srcName, dstName); dstAD.ReplaceResource(dstResName, srcRes.GetResourceData()); } } } else { // Replacing binary resources inside a .resources file EmbeddedResource srcBinaryResources; EmbeddedResource dstBinaryResources; srcBinaryResources = srcAD.MainModule.Resources.OfType <EmbeddedResource>().Single(er => er.Name.Equals(m_srcResourcesFilename, StringComparison.OrdinalIgnoreCase)); dstBinaryResources = dstAD.MainModule.Resources.OfType <EmbeddedResource>().Single(er => er.Name.Equals(m_dstResourcesFilename, StringComparison.OrdinalIgnoreCase)); MemoryStream resourceOutputStream = new MemoryStream(); ResourceReader srcReader = new ResourceReader(srcBinaryResources.GetResourceStream()); ResourceReader dstReader = new ResourceReader(dstBinaryResources.GetResourceStream()); ResourceWriter writer = new ResourceWriter(resourceOutputStream); IDictionaryEnumerator it = dstReader.GetEnumerator(); while (it.MoveNext()) { string currentResourceName = it.Key as string; Debug.Assert(currentResourceName != null); if (MatchWildcards(m_resourceNamePattern, currentResourceName) && srcReader.ContainsResource(currentResourceName)) { // Resource name matches wildcard. Copy from patch source UnmanagedMemoryStream data = srcReader.FindResource(currentResourceName); writer.AddResource(currentResourceName, data); } else { // Doesn't match - just copy across. string key = it.Key as string; UnmanagedMemoryStream data = it.Value as UnmanagedMemoryStream; Debug.Assert(key != null); Debug.Assert(data != null); writer.AddResource(key, data); } } writer.Generate(); writer.Close(); dstAD.ReplaceResource(m_dstResourcesFilename, resourceOutputStream.ToArray()); } dstAD.Write(dest); }