使用AssemblyBuilder构建资源程序集

Orr*_*rri 15 c# resources dynamic .net-assembly

场景:我想创建作为资源程序集的附属程序集.该程序集仅在其中编译资源(ResourceWriter). 目标是在VS之外创建资源程序集,并将它们添加到应用程序中,并将其添加到我的C#应用​​程序中

Atm我正在使用AssemblyBuilder来创建程序集.它有效,但没有关于存储的程序集的信息.没有cultureinfo,密钥或其他任何东西.程序集不会使用Missing Manfifest Resource Exception.:(

如果可能的话,我想继续使用AssemblyBuilder或使用CodeDomProvider.

问题:为我的应用添加新的卫星组件有什么必要?是否有足够的文件夹(en-US)和带有en-US资源的程序集?

问题2:是否可以向程序集提供一些元信息,如版本,文化?

问题3:是否足以将资源添加到程序集中?

码:

AssemblyBuilder builder = AppDomain.CurrentDomain.DefineDynamicAssembly(
                        assemblyName, AssemblyBuilderAccess.RunAndSave, resourceFolder);

builder.AddResourceFile(name, assemblyFileName);
builder.Save(assemblyName.Name);
Run Code Online (Sandbox Code Playgroud)

对于任何形式的帮助,我将不胜感激.提前致谢

Orr*_*rri 7

找到了解决方案.

资料来源:http://www.dotnet247.com/247reference/msgs/58/290731.aspx

说明:首先看来AssemblyBuilder只将资源链接到程序集,而不是嵌入.其次,资源必须在模块中才能被主程序集看到.(我不喜欢在模块中创建资源,但似乎没有办法嵌入已有的资源)

代码:

        string myAsmName = "WriteSatelliteAssembly.resources";
        string myAsmFileName = myAsmName + ".dll";
        string resourceName = "WriteSatelliteAssembly.MyResource2.fr.resources";
        string path;

        path = AppDomain.CurrentDomain.BaseDirectory + "fr-FR";
        AppDomain appDomain = Thread.GetDomain();
        AssemblyName asmName = new AssemblyName();
        asmName.Name = myAsmName;
        asmName.CodeBase = path;
        asmName.CultureInfo = new CultureInfo("fr");

        AssemblyBuilder myAsmBuilder = appDomain.DefineDynamicAssembly(
            asmName,
            AssemblyBuilderAccess.RunAndSave, path);

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

        rw.AddResource("resName","My (dynamic) resource value.");
        rw.AddResource("resName2","My (dynamic) second resource value.");

        myAsmBuilder.Save(myAsmFileName);
Run Code Online (Sandbox Code Playgroud)

证明短缺:

程序集中的链接资源

.file nometadata 'TestProjectResourceManager.Properties.Resources.en-US.resources'
    .hash = (57 DD 82 37 9E B3 BA 8A 27 D0 69 90 37 67 22 23   // W..7....'.i.7g"#
             A0 1C F7 47 )                                     // ...G
.mresource public TestProjectResourceManager.Properties.Resources
{
  .file 'TestProjectResourceManager.Properties.Resources.en-US.resources' at 0x00000000
}
Run Code Online (Sandbox Code Playgroud)

嵌入式资源在汇编中

.mresource public 'TestProjectResourceManager.Properties.Resources.en-US.resources'
{
  // Offset: 0x00000000 Length: 0x000000EE
}
.module TestProjectResourceManager_2.resources.dll
Run Code Online (Sandbox Code Playgroud)

玩得开心