Winform-重定向和"加载报告失败"错误

2020-08-22 02:44发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有2个winform应用程序。 一个(称为" A")是在VS2013中开发的,并使用CR SP 10。

较新的版本(" B")是在VS2017中开发的,使用的是CR SP 22。

两者均以32位(x86)编译。

应用程序(可执行文件,DLL,配置文件,.rpt文件)位于网络文件夹中。

用户已映射应用程序根文件夹,并运行网络文件夹中的应用程序exe文件。

这可以无缝部署应用程序更新。

客户端1已安装CR SP10(使用.msi),可以从控制面板中进行观察。

现在,我需要客户端1能够执行更新的应用程序B(使用CR SP22)。

为此,我根据配置文件2719939更新了配置文件(应用程序的根文件夹中的App.config和应用程序bin文件夹中的 .exe.config)。

实质上,较新的应用程序B中的配置文件将应用程序重定向为使用SP 22(位于应用程序的bin文件夹中):

<?xml版本=" 1.0"编码=" utf-8"?> <配置> <启动useLegacyV2RuntimeActivationPolicy =" true"> <运行时>


并像这样针对每个Crystal组件。

客户端运行并从较旧的应用程序A弹出水晶报表没有问题。

但是,当尝试运行更新的应用程序时,会出现错误"加载报告失败"。

(当然,我已经验证了报告的存在,路径正确)。

我查看了"对加载报告失败进行故障排除"文档(于2010年创建)。 我排除了任何权限问题,因为我(这是我作为"客户端"的测试机)能够运行旧版应用并显示CR(SP 10)报告。

此外,本文还指出对Temp文件夹的权限可能是一个问题。 TEMP系统环境变量为c:Windows \ temp。

此外,用户TEMP环境变量是c:\ Users \ \ AppData \ Local \ Temp,当我从较早的应用程序中打开CR报告时,我能够看到如何创建Crystal临时文件。 。

据此,我得出结论,至少对于CR SP 10,使用的临时文件夹不是* system * TEMP变量设置的文件夹,而是* user * TEMP变量设置的文件夹。

我现在遇到的问题是,SP 22使用的TEMP变量是什么? 如果CR SP22使用的TEMP变量是* system * TEMP变量,则有可能是权限的原因。但是,如果与CR SP 20相同,则权限是罪魁祸首,因为 我可以调出执行旧版SP10应用程序的CR报告,也许"加载报告失败"错误与重定向有关,而不与权限有关。

谢谢您的帮助。

张柏芝

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我有2个winform应用程序。 一个(称为" A")是在VS2013中开发的,并使用CR SP 10。

较新的版本(" B")是在VS2017中开发的,使用的是CR SP 22。

两者均以32位(x86)编译。

应用程序(可执行文件,DLL,配置文件,.rpt文件)位于网络文件夹中。

用户已映射应用程序根文件夹,并运行网络文件夹中的应用程序exe文件。

这可以无缝部署应用程序更新。

客户端1已安装CR SP10(使用.msi),可以从控制面板中进行观察。

现在,我需要客户端1能够执行更新的应用程序B(使用CR SP22)。

为此,我根据配置文件2719939更新了配置文件(应用程序的根文件夹中的App.config和应用程序bin文件夹中的 .exe.config)。

实质上,较新的应用程序B中的配置文件将应用程序重定向为使用SP 22(位于应用程序的bin文件夹中):

<?xml版本=" 1.0"编码=" utf-8"?> <配置> <启动useLegacyV2RuntimeActivationPolicy =" true"> <运行时>


并像这样针对每个Crystal组件。

客户端运行并从较旧的应用程序A弹出水晶报表没有问题。

但是,当尝试运行更新的应用程序时,会出现错误"加载报告失败"。

(当然,我已经验证了报告的存在,路径正确)。

我查看了"对加载报告失败进行故障排除"文档(于2010年创建)。 我排除了任何权限问题,因为我(这是我作为"客户端"的测试机)能够运行旧版应用并显示CR(SP 10)报告。

此外,本文还指出对Temp文件夹的权限可能是一个问题。 TEMP系统环境变量为c:Windows \ temp。

此外,用户TEMP环境变量是c:\ Users \ \ AppData \ Local \ Temp,当我从较早的应用程序中打开CR报告时,我能够看到如何创建Crystal临时文件。 。

据此,我得出结论,至少对于CR SP 10,使用的临时文件夹不是* system * TEMP变量设置的文件夹,而是* user * TEMP变量设置的文件夹。

我现在遇到的问题是,SP 22使用的TEMP变量是什么? 如果CR SP22使用的TEMP变量是* system * TEMP变量,则有可能是权限的原因。但是,如果与CR SP 20相同,则权限是罪魁祸首,因为 我可以调出执行旧版SP10应用程序的CR报告,也许"加载报告失败"错误与重定向有关,而不与权限有关。

谢谢您的帮助。

张柏芝

付费偷看设置
发送
6条回答
当学会了学习
1楼 · 2020-08-22 03:17.采纳回答

唐,谢谢您的反馈。

我解决了我的问题。 这是我所做的,希望对某人有帮助。

我同意您的要求,procmon条目" Microsoft \ Fusion"不是问题。 这是MS的组件,procmon条目与策略相关,我用绕过了(至少现在是这样)。

请记住1)客户端安装了CR SP 10运行时(与msi一起使用),以及2)我无法安装较新的应用程序使用的较新的CR SP22。 这就是为什么我在配置中使用bindingRedirect条目的原因。

我在配置中添加了,以禁用任何缓存的绑定尝试。

我添加了,以便CLR可以找到我较新应用程序的DLL(位于我较新应用程序的bin子文件夹中)。

Procmon显示已对CrystalDecisions.Windows.Forms.dll进行了调用,首先尝试在GAC中找到它(并找到PATH NOT FOUND),但随后尝试在bin子文件夹中找到它,并成功。

仍然,报告失败。

然后我注意到已经对所有其他这些DLL进行了调用:

crpe32.dll,crpe32_res_en.dll,crpe32LOC.dll,crpe32ENU.dll,crlogger.dll,Xalan-C_1_10.dll等

看起来错误的部分是,对于所有这些DLLS,要查找的路径为:

C:\ Program Files(x86)\ SAP BusinessObjects \ .NET Framework 4.0的Crystal Reports \ Common \ SAP BusinessObjects Enterprise XI 4.0 \ win32_x86

procmon显示可以完全"成功"找到这些DLL,但是,这些是CR SP 10 DLL! 难怪,即使找到了这些DLL,该报告仍存在加载问题。

因此,这就是我解决问题的方式:我在应用程序的根文件夹下创建了一个子文件夹" crbin",并在其中复制了整个CR SP 20文件夹(来自DEV计算机)。

C:\ Program Files(x86)\ SAP BusinessObjects \ .NET Framework 4.0的Crystal Reports \ Common \ SAP BusinessObjects Enterprise XI 4.0 \ win32_x86

并在配置中调整了路径,以便CLR可以找到它们:

<探测privatePath =" bin; crbin \ win32_x86; crbin \ win32_x86 \ dotnet"/>

此后,执行更新的应用程序,并成功加载报告。

顺便说一句,我在4个CR引用(CrystalDecisions.CrystalReports.Engine.dll,CrystalDecisions.ReportSource.dll,CrystalDecisions.Shared.dll,CrystalDecisions.Windows.Forms.dll)中将" Copy Local"设置为true。 我的较新的应用程序。 我为什么要将其设置为false? 对于较新的应用程序,我确实希望将DLL复制到输出文件夹(将其设置为bin),因为由于给定的限制,我将无法安装较新的CR SP 22运行时。

非常感谢您的帮助

张柏芝

huskylover
2楼-- · 2020-08-22 03:24

我运行procmon帮助查看问题的确切位置。

请参见下图。

1)第一个失败的条目与某些策略的"未找到名称"相关。在此之前,策略默认读取为sea,所以我认为这些不是罪魁祸首。

2)然后,第一个看起来像问题的条目是与CrystalDecisions.Windows.Forms条目关联的"未找到路径"。

procmon中的路径显示:

C:\ WINDOWS \ Microsoft.Net \ assembly \ GAC_32 \ CrystalDecisions.Windows.Forms \ v4.0_13.0.3500.0__692fbea5521e1304

路径是包含版本名称的错误名称

为什么要尝试在GAC中找到CrystalDecisions.Windows.Forms.dll? DLL位于文件夹的应用程序的bin文件夹中。

SKY徐
3楼-- · 2020-08-22 03:21

我们不支持Fuzion下载站点,因为找到丢失的reg密钥会成为可能。 成为问题。

也不要在项目中使用"本地复制",Cr几乎所有内容都使用GAC,以保持应从版本加载它们的版本。 GAC。

第二个问题是不要在配置文件中使用useLegacyV2RuntimeActivationPolicy =" true",这只是2.0/3.5框架设置,不再需要SP 21+以上版本。

导致lad报告失败错误的典型问题是IIS的连续内存块用完了,CR需要它们。 经常循环IIS,因为它不能即时对内存进行碎片整理。

在完成处理后,请确保关闭并释放报表对象。

CR代码必须位于Page_Init部分,并且

Don

悻福寶寶
4楼-- · 2020-08-22 03:36

成功运行后,现在报表将不会加载。

再次检查procmon时,我发现在.NET Framework 4.0 \ Common \ SAP BusinessObjects Enterprise XI 4.0 \ win32_x86的C:\ Program Files(x86)\ SAP BusinessObjects \ Crystal Reports中查找了一些DLL的调用 文件夹。

我不知道为什么以前没有发生过这种情况。

无论如何,我需要了解一些内容:

如果CLR在"晶体安装文件夹" C. \ Program Files(x86)\ SAP BusinessObjects \ Crystal Reports for .NET Framework 4.0 \ Common \ SAP BusinessObjects Enterprise XI中寻找Crystal DLL(至少一些DLL), 4.0 \ win32_x86,显示该报告不会出现问题,因为正在运行的应用程序是新的CR SP22(我无法为其安装运行时(使用.msi),因为它会破坏旧的应用程序,即 是使用bindingredirects的全部原因),并且此文件夹中的DLL是旧的(CR SP 10)。

因此,如果查找的文件夹仅为.NET Framework 4.0 \ Common \ SAP BusinessObjects Enterprise XI 4.0的C:\ Program Files(x86)\ SAP BusinessObjects \ Crystal Reports,则装订重定向应该如何工作? \ win32_x86 ??

例如,附加的procmon条目显示了所有查找crlang.dll的路径-它们都在此文件夹中寻找。 该dll已成功找到(因此我认为已使用),只有此文件夹包含较旧的DLL!

procmon-example-filtering-crlangdll.png

clasier
5楼-- · 2020-08-22 03:32
# p#

顺便说一句,我也尝试过使用Copy Local = false

另外,这也不是内存问题,我在窗体关闭时清理CR资源。

软件心理学工程师
6楼-- · 2020-08-22 03:39

好吧,绑定重定向的"替代方法"不能解决此问题:

-客户端已安装CR SP10运行时。

-客户端A需要能够执行使用VS2013 + CR SP 10构建的应用程序

-同一客户端还应该能够执行另一个使用VS2017 + CR SP 22构建的应用。

bindingredirect不起作用,例如,客户端可以运行odler应用,但不能运行新的应用。 发生"加载报告失败"错误。

我在较新的应用程序的配置中使用bindingredirect条目重定向到SP22。此类条目:

无济于事。

看一下procmon,毫不奇怪的是,为什么这种重定向对较新的应用程序不起作用:在某些时候,Crystal会在C:\ Program Files(x86)\ SAP BusinessObjects \ Crystal Reports的硬编码路径中查找。 NET Framework 4.0 \ Common \ SAP BusinessObjects Enterprise XI 4.0 \ win32_x86

但是,在客户端计算机中,此文件夹包含较旧的CR SP 10。

我今天尝试的最终方法是,在较新的应用程序中使用bindingredirect以使用CR SP 10。

这也不起作用,因为"应用已停止工作"而失败。

就我而言,剩下的唯一解决方案是将较旧的应用程序转换为较新的CR SP 22。

这将需要在每个客户端中卸载较旧的CR,然后安装较新的CR。

谢谢

张柏芝

一周热门 更多>