Localization CRM 2011、ILMerge和本地化

Localization CRM 2011、ILMerge和本地化,localization,dynamics-crm-2011,ilmerge,Localization,Dynamics Crm 2011,Ilmerge,我在将本地化附属程序集合并到CRM2011的插件DLL时遇到一些问题 要么这样,要么我不知道以后如何使用合并的资源 我创建了一些插件,并创建了一个基本的资源文件(默认为英语)和一个特定文化的资源文件(在撰写本文时,它是用于波兰语本地化的,但稍后我还需要添加法语) 我确保不对程序集本身进行签名,因为ILMerge将对完成的程序集本身进行签名 这是用于合并额外附属部件的命令: ilmerge /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\

我在将本地化附属程序集合并到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
正如您所看到的,插件在.NET4.0中,我已经获得了ILMerge所需的.config文件,以使用所需的程序集进行合并

生成的文件看起来不错,我可以用CRM插件注册器注册,添加新的步骤等等

但是,它将始终使用默认语言。我已尝试更改
系统.Threading.Thread.CurrentThread.UICulture
,但没有效果。当我创建一个
ResourceManager
类并使用
GetString(“ErrorMessage”,new System.Globalization.CultureInfo(“pl”)
)时,我得到了一个
异常,指定的
ResourceManager
不知道如何处理指定的区域性

我知道这个问题。然而,发布的解决方案似乎是旧的。生成的resource.cs文件不使用组件ResourceManager
。此外,发布在那里的部分代码被标记为已弃用

我真的不确定我现在要做什么,或者如何进一步调试它,因为我在处理程序集本身时几乎没有经验。请帮我控制这些卫星组件


更新:

我已经使用沙盒插件有一段时间了,因此我不再能够访问诸如
CurrentCulture
(或者至少我不能更改这些东西)。我再次尝试解决这个问题:我创建了一个简单的插件,当保存一个新帐户时,它会被激活。没什么特别的。以下是实际的插件代码:

        ResourceManager rm = new ResourceManager(typeof(Properties.Resources));
        var s = rm.GetString("ErrorAlreadyPosted", new System.Globalization.CultureInfo("pl-PL"));
        throw new InvalidPluginExecutionException(s);
代码不再引发无法找到指定区域性的异常。。。显然,代码最后会抛出异常,但重要的是异常消息是什么。我希望它是波兰语的

唉,事实并非如此。
GetString
返回的字符串仍然是英文


我用于ILmerge的命令与以前相同,但是指定了
/lib
参数,这样我就不必复制所有CRM SDK DLL…

如果使用反射器工具查看生成的程序集,您是否看到正确嵌入的资源?您可能遇到了您发布的链接中概述的错误

尝试设置
Thread.CurrentThread.CurrentUICulture
和\或
Thread.CurrentThread.CurrentCulture


还可以尝试挂接到
AppDomain.CurrentDomain.AssemblyLoad
和\或
AppDomain.CurrentDomain.AssemblyResolve
以调试尝试加载的程序集以及从何处加载的程序集。您可能需要自定义它们的行为,以便代替加载外部程序集而加载内部资源

您可以尝试将项目引用嵌入为资源,而不是使用ilmerge。

请参阅:

显然,不可能使用插件的上下文从中读取资源

阅读MSDN:

Quote:当插件需要本地化文本时,可以使用XML web资源存储本地化字符串,以便插件在需要时可以访问它们。XML的结构是您的选择,但是您可能希望按照ASP.NET资源(.resx)文件使用的结构为每种语言创建单独的XML web资源。例如,下面是一个名为localizedString.en_US的XML web资源,它遵循.resx文件使用的模式


到目前为止,我只知道这些——我还没有为crm插件的本地化构建自己的解决方案。

我们最终处理这一问题的方法是添加本地化XML文件(由Visual Studio生成)作为crm资源,并创建一点自定义代码来查找适当的资源,然后在其中查找本地化文本


显然,这并不像使用生成的C#本地化类那么简单,需要做一些准备工作。然而,准备工作就绪,使用
nameof
后,现在几乎和前面提到的资源类一样简单。

我有一个问题,我怀疑这与您的问题是一样的——希望显示来自插件的本地化错误消息,但却完全没有幸让ResourceManager处理安装到DB中的插件。时间对我来说很短,所以我正在使用XML文件实现一个自定义解决方案。一点也不理想。如果有人提出解决方案,我会很感兴趣。堆栈跟踪的完整错误消息是什么?如果不使用ilmerge,它是否有效?能否附加一个可以重现此问题的示例单元测试?我从未创建过单元测试。:/我当然可以试试,但不能保证它会有用。此外,我对单元测试的了解很少。。。但它们不是针对特定的方法吗?你想用哪种方法
GetString
?很抱歉这么晚才回复。我一直忙于其他项目,而且。。。圣诞节等等。CurrentCulture/UICulture已明确设置。连接事件听起来是个好主意,但我不完全确定在CRM设置中如何工作。请查看文档中的示例代码:
AppDomain.CurrentDomain.AssemblyLoad
在沙盒CRM插件中不可用。它有利于调试,但我不能依靠它实际做任何事情(>堆栈跟踪的完整错误消息是什么?如果不使用ilmerge,它是否有效?不,它不是ilmerge pro