C# wpf,winform修改另一個.net EXE程序集的resources 資源文件


可以使用Mono.Cecil庫更新、添加可執行文件的資源
以下是使用 Mono.Cecil 進行資源操作的三種基本方法:

首先需要程序中引入 Mono.Cecil
Nuget:
PM> Install-Package Mono.Cecil

三種方法

public static void ReplaceResource(string path, string resourceName, byte[] resource)
{
    var definition =
        AssemblyDefinition.ReadAssembly(path);

    for (var i = 0; i < definition.MainModule.Resources.Count; i++)
        if (definition.MainModule.Resources[i].Name == resourceName)
        {
            definition.MainModule.Resources.RemoveAt(i);
            break;
        }

    var er = new EmbeddedResource(resourceName, ManifestResourceAttributes.Public, resource);
    definition.MainModule.Resources.Add(er);
    definition.Write(path);
}

public static void AddResource(string path, string resourceName, byte[] resource)
{
    var definition =
        AssemblyDefinition.ReadAssembly(path);

    var er = new EmbeddedResource(resourceName, ManifestResourceAttributes.Public, resource);
    definition.MainModule.Resources.Add(er);
    definition.Write(path);
}

public static MemoryStream GetResource(string path, string resourceName)
{
    var definition =
        AssemblyDefinition.ReadAssembly(path);

    foreach (var resource in definition.MainModule.Resources)
        if (resource.Name == resourceName)
        {
            var embeddedResource =(EmbeddedResource) resource;
            var stream = embeddedResource.GetResourceStream();

            var bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);

            var memStream = new MemoryStream();
            memStream.Write(bytes,0,bytes.Length);
            memStream.Position = 0;
            return memStream;
        }

    return null;
}

您可以讀取/寫入或修改當前資源或創建新資源,然后只需通過調用 或添加它作為新資源調用即可將其放回可執行文件ResourceWriter、ResourceReader、ResourceEditor

下面是替換資源中的圖像的示例

var ms = new MemoryStream();
var writer = new ResourceWriter(ms);
writer.AddResource("good_luck",new Bitmap("good_luck.png"));
writer.Generate();   
ReplaceResource(@"my executale.exe", "ResourceTest.Properties.Resources.resources",ms.ToArray());


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM