0

我正在尝试本地化 SSRS 报告。我有一个 DLL,它使用 ResourceManager 来访问嵌入在 dll 中的资源文件。我的报告引用了 dll。该 dll 已签名并具有强名称。dll 和资源文件的 dll 被编译并在 MicrosoftVisualStudio9.0/Common7/IDE/PrivateAssemblies 和 Microsoft SQL Server\MSRS10.REPORTSERVER\Reporting Services\ReportServer\bin 中。资源 dll 也使用 gacutil 安装在 GAC 中。

SSRS 有时会正确找到它需要的资源键并显示它。但是,当更改资源文件以添加更多键和值时,我无法让 SSRS 访问新添加的文件。我已经重复了上述所有步骤,甚至卸载并安装了 GAC 中的资源。我仍然无法让它工作。

知道我错过了哪一步吗?显然这个过程是有效的,我只是没有重复我需要做的事情。

4

2 回答 2

1

对于那些对稍微不同的方法感兴趣的人,您可能想尝试使用不使用标准资源管理而是依赖于简单文件 IO 的本地化程序集。这使得对现有 resx 文件的更改或添加新文件的问题更少。您可以添加或更改 resx 文件,并立即检索用于报告的值。我遵循了这个例子,只做了一些小的调整,并且对结果非常满意:http: //www.codeproject.com/Articles/294636/Localizing-SQL-Server-Reporting-Services-Reports

不过需要注意的是,添加新 CodeGroup 时要遵循的步骤有些欠缺,因为如果您将新 CodeGroup 放置在除未命名的 UnionCodeGroup 之后(它是带有 Url="$CodeGen$/*" 的那个)之外的任何地方,您尝试访问您的自定义程序集将失败。

经过大量挖掘后,我能够在其中一个 msdn 页面上找到对此的确认(请参阅“扩展代码组元素的放置”部分)。他们的措辞是“推荐”,但从我的测试来看,我认为这是必需的,至少在直接在报表服务器上进行测试时:http: //msdn.microsoft.com/en-us/library/ms152828.aspx

在 wix 中用于 rssrvpolicy.config 文件中此位置的 xpath 是:

//PolicyLevel/CodeGroup/CodeGroup[\[]@class='FirstMatchCodeGroup'[\]]/CodeGroup[\[]@PermissionSetName='ReportLocalization'[\]]

下面是如何使用 util:XmlConfig 扩展在 WiX 中完成此操作的示例:

    <DirectoryRef Id="TARGETDIR">
        <Component Id="I18N_RSSRVPOLICY_CONFIG" Guid="some GUID">
            <util:XmlConfig
                Id="RS_i18n_PermissionSet_remove_if_already_exists"
                File="[SQLREPORTINGSERVICESPATH]ReportServer\rssrvpolicy.config"
                Action="delete"
                On="install"
                ElementPath="//NamedPermissionSets"
                VerifyPath="//NamedPermissionSets/PermissionSet[\[]@Name='ReportLocalization'[\]]"
                Node="element"
                Sequence="100">
            </util:XmlConfig>
            <util:XmlConfig
                Id="RS_i18n_PermissionSet_add"
                File="[SQLREPORTINGSERVICESPATH]ReportServer\rssrvpolicy.config"
                Action="create"
                On="install"
                ElementPath="//NamedPermissionSets"
                VerifyPath="//NamedPermissionSets/PermissionSet[\[]@Name='ReportLocalization'[\]]"
                Node="document"
                Sequence="101">
                <![CDATA[
        <PermissionSet class="NamedPermissionSet" version="1" Unrestricted="true" Name="ReportLocalization" Description="A special permission set that allows Execution and Assertion" />
        ]]>
            </util:XmlConfig>
            <util:XmlConfig
                Id="RS_i18n_CodeGroup_remove_if_already_exists"
                File="[SQLREPORTINGSERVICESPATH]ReportServer\rssrvpolicy.config"
                Action="delete"
                On="install"
                ElementPath="//PolicyLevel/CodeGroup/CodeGroup[\[]@class='FirstMatchCodeGroup'[\]]"
                VerifyPath="//PolicyLevel/CodeGroup/CodeGroup[\[]@class='FirstMatchCodeGroup'[\]]/CodeGroup[\[]@PermissionSetName='ReportLocalization'[\]]"
                Node="element"
                Sequence="102">
            </util:XmlConfig>
            <util:XmlConfig
                Id="RS_i18n_CodeGroup_add"
                File="[SQLREPORTINGSERVICESPATH]ReportServer\rssrvpolicy.config"
                Action="create"
                On="install"
                ElementPath="//PolicyLevel/CodeGroup/CodeGroup[\[]@class='FirstMatchCodeGroup'[\]]"
                VerifyPath="//PolicyLevel/CodeGroup/CodeGroup[\[]@class='FirstMatchCodeGroup'[\]]/CodeGroup[\[]@PermissionSetName='ReportLocalization'[\]]"
                Node="document"
                Sequence="103">
                <![CDATA[
          <CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="ReportLocalization" Name="Verint.SSRS.Localization" Description="This grants the Verint.SSRS.Localization.dll ReportLocalization Permissions">
            <IMembershipCondition class="UrlMembershipCondition" version="1" Url="UPDATE_ME"/>
          </CodeGroup>]]>
            </util:XmlConfig>
            <util:XmlConfig
                Id="RS_i18n_CodeGroup_update"
                File="[SQLREPORTINGSERVICESPATH]ReportServer\rssrvpolicy.config"
                Action="create"
                On="install"
                ElementPath="//IMembershipCondition[\[]@Url='UPDATE_ME'[\]]"
                Name="Url"
                Value="[SQLREPORTINGSERVICESPATH]ReportServer\bin\Verint.SSRS.Localization.dll"
                Node="value"
                Sequence="104">
            </util:XmlConfig>
            <util:XmlConfig
                Id="RS_i18n_REDP_CodeGroup_update"
                File="[SQLREPORTINGSERVICESPATH]ReportServer\rssrvpolicy.config"
                Action="create"
                On="install"
                ElementPath="//CodeGroup[\[]@Name='Report_Expressions_Default_Permissions'[\]]"
                Name="PermissionSetName"
                Value="FullTrust"
                Node="value"
                Sequence="105">
            </util:XmlConfig>
        </Component>
    </DirectoryRef>

我建议备份原始配置文件(使用 WiX 或自定义操作)。这可以使卸载更容易,因为您可以替换那些原件,并且还因为您可以一遍又一遍地测试它,直到它做您想要的。祝大家好运!

于 2013-04-18T23:31:55.887 回答
0

您是否使用每个更新(包括在 GAC 中)重新构建和重新部署所有附属程序集?

如果不是,听起来问题是由于程序集版本控制造成的。有一个SatelliteContractVersion 属性,您可以将其应用于您的主程序集以帮助解决此问题。尽管每次部署更新时重建/重新分配/重新部署所有附属程序集可能会更容易。

于 2012-06-22T09:57:00.960 回答