RDLC 报告 - 如何使用报告中的自定义代码访问本地化的字符串值

RDLC Report - How to access localized string values using custom code within the report

全部,

我正在从 .net 2 升级到 .net 4.6,但我的 RDLC(即本地)报告有问题。

具体来说,我的 RDLC 报告了来自我的一个程序集的参考代码,该程序集执行对语言特定的 .resx 文件的访问。这使我能够以独立于语言的方式创建引用特定语言字符串、单词的报告表达式。

在我们从 .net 2 切换到 .net 4 之前,一切都很好。随着新的 CAS 更改,我被迫重写代码,专门从这里添加程序集引用:

report.AddTrustedCodeModuleInCurrentAppDomain();

对此:

SetBasePermissionsForSandboxAppDomain();
AddFullTrustModuleInSandboxAppDomain();

但现在我发现这会导致我的自定义 DLL 在没有当前 HTTP 上下文的情况下第二次加载到报告中。没有当前的 HTTP 上下文,我无法通过以下方式访问我的字符串 .resx 文件:

String localizedValue =
                (string)HttpContext.GetGlobalResourceObject(
                    resourceFile, resourceKey);

因此,我有一些选择,但需要指导如何完成这些:

顺便说一句,通过参数传递 lang 特定的字符串并不是一个选项,因为我有很多字符串,这意味着很多自定义参数。

1) 从我的 .resx 文件中检索 lang 特定字符串的另一种方法(是否有另一种方法我可以在没有 HttpContext.GetGlobalResourceObject 的情况下调用)?或者我必须手动编码加载 .resx 文件并解析它们(这将是很多工作)

2) 以某种方式在我的报告上下文中获取当前 HTTP 上下文。我在这里尝试变得聪明,并创建了一个静态 ctor,我在其中将我的静态变量初始化为当前 HTTP 上下文。不幸的是,这不起作用,因为当报表引擎计算报表中的表达式时,它似乎加载了同一程序集的另一个版本(在我调试它时观察到)。

3) 您建议的另一种解决方案。

在探索了各种可能的可能性之后,最优雅的解决方案是创建语言字符串的附属程序集,然后按照建议使用 ResourceManager class 加载程序集并从另一个程序集中检索字符串。

仅供参考: 为此,您需要在 bin 文件夹中包含附属程序集。