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);
        }