c# - 反射(reflection) |发射|动态资源生成 - 使用 IResourceWriter.AddResource(key,value) 添加的资源值无法读取

标签 c# reflection reflection.emit resourcemanager assemblybuilder

我正在尝试使用一些资源生成一个程序集文件。我正在使用 System.Reflection.Emit.ModuleBuilder 来定义资源。 AssemblyBuilder 保存程序集,没有给出任何错误,但是当我尝试读取资源时,ResourceManagerResourceSets 中没有任何条目。我不确定 AssemblyBuilder 不会保存添加的资源,或者我的资源读取代码有问题。

汇编生成代码:

public void GenerateAsm()
    {
        string myAsmName = "MyAssembly.resources";
        string myAsmFileName = myAsmName + ".dll";
        string resourceName = "MyAssembly.Resource.fr.resources";

        AppDomain appDomain = Thread.GetDomain();
        AssemblyName asmName = new AssemblyName();
        asmName.Name = myAsmName;
        AssemblyBuilder myAsmBuilder = appDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);

        ModuleBuilder myModuleBuilder = myAsmBuilder.DefineDynamicModule(myAsmFileName,myAsmFileName);
        IResourceWriter rw = myModuleBuilder.DefineResource(resourceName, "My Description", ResourceAttributes.Public);

        rw.AddResource("ResKey1", "Resource value 1.");
        rw.AddResource("ResKey2", "Resource value 2.");
        myAsmBuilder.Save(myAsmFileName);    
    }

资源读取代码:

public void ReadResource()
    {
        ResourceManager rm = new ResourceManager("MyAssembly.Resource.fr.resources", Assembly.LoadFrom("MyAssembly.resources.dll"));
        string greeting = rm.GetString("ResKey1");
    }

资源管理器可以加载资源,但它没有任何键值对。

最佳答案

生成的程序集包含资源值:

enter image description here

所以问题在 ResourceManager .

The ResourceManager class retrieves resources from a binary .resources file that is embedded in an assembly or from a standalone .resources file

并且您正在创建的资源不是嵌入的二进制 .resources 文件

尝试 ResourceReader,它更适合您的情况

using (var reader = new ResourceReader(asm.GetManifestResourceStream(resourceName)))
{
    foreach (DictionaryEntry entry in reader)
    {

    }
}

enter image description here

关于c# - 反射(reflection) |发射|动态资源生成 - 使用 IResourceWriter.AddResource(key,value) 添加的资源值无法读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45714865/

相关文章:

c# - 单元测试保存更改失败

c# - 通过 C# 中扩展方法的反射获取泛型重载

c# - WPF - 如何与动态创建的控件实现双向数据绑定(bind)?

c# - 如何发出对 [mscorlib]System.Console::Write(char) 的调用?

c# - 使用 Reflection.Emit 覆盖属性定义

c# - 通过表达式树编译动态实例方法,具有私有(private)和 protected 访问权限?

c# - 为什么在 owin 实现后,swagger 不起作用?

c# - Xamarin.Forms iOS 在设备在线时抛出 NSURLErrorDomain "internet connection offline"

c# - 关于 Linq to Sql 排序的查询

c# - 判断两个不同的 PropertyInfo 是否来自同一个接口(interface)?