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)
对于任何形式的帮助,我将不胜感激.提前致谢
找到了解决方案.
资料来源: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)
玩得开心