我们有一个应用程序,其编译时的结构如下所示:
是否可以在此使用ILMerge?你会怎么做?
resources ilmerge assemblies localization satellite-assembly
我正在使用ILMerge从包含1个exe和2个资源dll的项目中创建单个程序集应用程序:
这是一个简单的测试项目,有1个表单(Form1.cs),所以没什么特别的.我的目标是使用工作资源管理器创建一个单独的程序集应用程序(我已阅读ILMerge和本地化资源程序集以及单程序集多语言Windows窗体部署(ILMerge和附属程序集/本地化) - 可能吗?有关如何执行的信息这个).
编译项目后,我使用以下命令行参数运行ILMerge:
ilmerge /log:test.txt /target:winexe /copyattrs /allowdup /out:test_merged.exe
"C:\projectdir\bin\Debug\test.exe" "C:\projectdir\bin\Debug\fr-FR\test.resources.dll"
"C:\projectdir\bin\Debug\nl-BE\test.resources.dll"
Run Code Online (Sandbox Code Playgroud)
如果我使用Reflector检查合并程序集的内容,我在资源树节点下看到以下内容:
而不是fr-FR和nl-BE资源,我有2倍的fr-FR资源.这是因为资源dll的名称相同吗?结果是我只能在运行时获取fr-FR资源.
有任何想法吗 ?
更新(日志文件内容):(注意:二进制文件以"loc_"为前缀,为了清楚起见,我在之前的帖子中将它们删除了)
ILMerge version 2.10.526.0
Copyright (C) Microsoft Corporation 2004-2006. All rights reserved.
ILMerge /log:loc_test.txt /target:winexe /copyattrs /allowdup /out:loc_test_merged.exe c:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\loc_test.exe C:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\fr-FR\loc_test.resources.dll C:\Users\<user>\Documents\Visual Studio 2008\Projects\loc_test\loc_test\bin\Debug\nl-BE\loc_test.resources.dll
Set platform to 'v2', using directory 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\..\v2.0.50727' for mscorlib.dll
Running on Microsoft (R) .NET Framework …Run Code Online (Sandbox Code Playgroud) 我正在开发一个用户控件,现在(在工作结束时)我正面临着使它成为多语言的问题.我想我可以这样做:
Localizable = true控件,让VS生成我需要的默认语言的所有"记录". 所以使用MSDN中的代码
Assembly myAssembly = this.GetType().Assembly;
ResourceManager mgr = new ResourceManager("namespace.resource", myAssembly);
mgr.GetString(...)
Run Code Online (Sandbox Code Playgroud)
我的工作可以(轻松)完成.
但我有一些问题:
new ResourceManager(...)由于目标应用程序中的主命名空间更改,我是否可以使用?感谢大家
经过一些研究后我回答了一些问题:
再次感谢
我在将本地化附属程序集合并到CRM2011的插件DLL中时遇到了一些麻烦.
要么是,要么我不知道如何使用合并后的资源.
我创建了一些插件并创建了一个基本资源文件(默认 - 英语)和一个特定文化(在编写波兰语本地化时,但后来我还需要添加法语).
我确保不要对组件本身进行签名,因为ILMerge将签署完成的组件本身.
这是我用来合并额外附属程序集的命令:
ilmerge /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /log:log.txt /keyfile:KeyFile.snk /out:Plugins.dll DynamicsCRM2011.Plugins.dll pl-PL\DynamicsCRM2011.Plugins.resources.dll
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,插件是在.NET 4.0中,我已经获得了ILMerge所需的.config文件,以便使用所需的程序集进行合并.
生成的文件显示正常,我可以使用CRM插件管理员注册,添加新步骤等等.
但是,它将始终使用默认语言.我试过改变了System.Threading.Thread.CurrentThread.UICulture,但这没有用.当我创建一个ResourceManager类并使用时GetString("ErrorMessage", new System.Globalization.CultureInfo("pl-PL")),我得到Exception了指定的ResourceManager不知道如何处理指定的文化.
我在这里知道这个问题.但是,发布的解决方案似乎是一个旧的解决方案.生成的资源.cs文件不使用ComponentResourceManager.此外,在那里发布的部分代码已被标记为已弃用.
我不确定我现在要做什么,或者如何进一步调试这个,因为我在处理程序集本身方面经验很少.请帮助我控制那些卫星组件.
更新:
我一直在使用沙盒插件一段时间了,因此我不再能够访问诸如此类的东西CurrentCulture(或者至少我无法改变这些东西).我已经尝试再次解决这个问题:我创建了一个简单的插件,在保存新帐户时会触发该插件.没有什么花哨.这是实际的插件代码:
ResourceManager rm = new ResourceManager(typeof(Properties.Resources));
var s = rm.GetString("ErrorAlreadyPosted", new System.Globalization.CultureInfo("pl-PL"));
throw new InvalidPluginExecutionException(s);
Run Code Online (Sandbox Code Playgroud)
该代码不再抛出有关无法找到指定的文化......也是很明显的代码抛出一个最后的异常的异常,但重要的是什么异常消息.我希望它是波兰语.
唉,事实并非如此.返回的字符串GetString仍然是英文.
我用于ILmerge的命令与之前相同,但是/lib指定了参数,以便我不必复制所有CRM SDK dll ...
我们有一个有趣的要求,我们要在运行时支持多种语言,因为我们是一项服务.如果用户使用日语或英语与我们交谈,我们将希望以适当的语言回复. FxCop喜欢我们将我们的字符串存储在资源文件中,但我很想知道是否有一种集成方式可以在运行时选择资源字符串而无需手动执行.
结论:我们需要能够在一个二进制文件中支持多种语言.:)
ilmerge ×3
localization ×3
c# ×2
winforms ×2
.net ×1
.net-2.0 ×1
assemblies ×1
multilingual ×1
resources ×1