问题描述:创建了类库编译成RSCustomLib.dll
在服务器报表引用一点问题也没有,也能如期工作。但在本地报表引用相同的程序集则编译时报如下错误:
加载代码模块时出错:“RSCustomLib, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null”。详细信息: 未能加载文件或程序集“RSCustomLib, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
细心的朋友从上面信息可以猜出本地报表的自定义程序集需要部署为GAC方式,确实如此。
本地报表使用自定义程序集部署步骤:
1.打开自定义的程序集项目;
2.对托管程序集进行强签名(您可以使用SDK命令:>sn /K c:\key.snk然后将Key.snk添加到项目并签名,或在VS project->properties->signing中进行签名)
3.保存并编译。
4.在运行的计算机的GAC中安装程序集。(您可以使用VS Command:>gacutil /i AssemblyName.dll,也可以直接把dll拖入C:\Windows\assembly文件夹)
(PS:不放GAC好像也可以,复制到C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\PrivateAssemblies下,还需要在前端使用本地报表(或者说使用ReportViewer控件)的工程引用该程序集;当然bin\debug目录下需要存在该dll文件)
接着,在本地报表文件(.rdlc)中选中报表单击报表属性切到引用页,引用刚才编译的dll文件,设置号类名(如RSCustomLib.TestClass)、实例名(如myTestClass);
然后在需要使用的位置如报表的文本框设置其值(如表达式:=Code.myTestClass.GetHello());
另外,需要强调的是您需要使用在显示报表前使用LocalReport.ExecuteReportInCurrentAppDomain(AppDomain.CurrentDomain.Evidence);
及LocalReport.AddTrustedCodeModuleInCurrentAppDomain() 来添加程序集为信任程序集。
如:reportViewer1.LocalReport.ExecuteReportInCurrentAppDomain(AppDomain.CurrentDomain.Evidence);
this.reportViewer1.LocalReport.AddTrustedCodeModuleInCurrentAppDomain("RSCustomLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f1252188e7ed8fc3");
PublicKeyToken等值需要根据您部署在GAC的相应值设置;
运行可能还会报错“该程序集不支持部分受信任的调用方”。
在自定义程序集项目的AssemblyInfo.cs文件中加入:[assembly: AllowPartiallyTrustedCallers] 就可以解决了。
在%RSCustomLib\bin\Debug运行部署批文件deploy.bat,内容如下:
copy RSCustomLib.* "C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies"(BIDS报表设计预览)
copy RSCustomLib.* "C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\PrivateAssemblies"(如果使用VS2008的话)
copy RSCustomLib.* "C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer\bin"
服务器端报表部署使用该自定义程序集的步骤:
1、copy RSCustomLib.* "C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer\bin"
2、服务器报表的自定义程序集如使用打开文件、访问SQL资源等还必须作下面的设置(原因RS对于表达式默认执行权限是“Execution”,需要修改为“FullTrust”):
还需要设置安全性,将FullTrust安全许可赋予报表表达式(注意:这是高风险操作,在生产环境最好不要使用):
修改下面文件C:\Program Files\Microsoft SQL Server\MSSQL.4\Reporting Services\ReportServer\rssrvpolicy.config
在该文件中查找文本Name="Report_Expressions_Default_Permissions"将其上面一行内容修改为PermissionSetName="FullTrust";
3、其次还需在该文件(rssrvpolicy.config)的倒数第2个</CodeGroup>前增加一段引用自定义程序集的内容:
<CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Description="This special code group grants RSCustomLib.dll FUllTrust permission. ">
<IMembershipCondition class="UrlMembershipCondition" version="1" Url="C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer\bin\RSCustomLib.dll" />
</CodeGroup>