我有第三方工作流程软件(Captaris Teamplate),它引用了我的项目中的一个程序集,该程序集通过GAC从我们的项目解决方案引用其他程序集。
当我们的应用程序执行时,它会调用Captaris Teamplate方法来创建工作流程,然后使用GAC中的项目程序集将数据存储到 一个数据库。
问题是我编译项目并从GAC中删除程序集用新版本替换它们,但是当我运行整个项目时,Captaris Teamplate会抛出错误:
异常类型:System.IO.FileNotFoundException
消息:找不到文件或程序集名称VBAssembly或其依赖项之一 FileName:VBAssembly
FusionLog:===预绑定状态信息===
日志:DisplayName = VBAssembly,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null
也就是说,它不会给我程序集DLL文件的名称。它试图找到它正在寻找的版本。对这样的问题进行故障排除就像在黑暗中拍摄一样,它可以消除几天删除保存在ASP.NET临时文件夹,项目文件夹和网站文件夹(inetpub)中的旧程序集,重新启动等,测试错误,得到错误,搜索其他一些旧程序集等等。
所以我的问题是:
我们在Visual Studio 2003和Captaris Workflow 5.0中使用ASP.NET 1.1版。
答案 0 :(得分:1)
如果可能,请避免使用GAC。它适合DLL地狱。 VBAssembly实际上可能是不受管理的,可能已从WINDOWS/system32
目录中删除。
答案 1 :(得分:1)
您可以做的另一件事是“强行”通过web.config引用您想要的程序集版本。以下是我在web.config中的示例,以确保我在我的Web应用程序中访问正确版本的Crystal Reports ...
<assemblies>
<add assembly="CrystalDecisions.Web, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
<add assembly="CrystalDecisions.Shared, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
<add assembly="CrystalDecisions.ReportSource, Version=11.5.3700.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
<add assembly="CrystalDecisions.Enterprise.Framework, Version=11.5.3300.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
</assemblies>
我确信你可以做同样的事情来引用你的库,你只需要确保它们有一个强大的命名键,以便有一个PublicKeyToken来引用。
答案 2 :(得分:1)
也许您可以创建一个绑定策略,将您从XXX移除的程序集的任何请求重定向到新位置。请参阅 Binding Policy 。
答案 3 :(得分:1)
使用Dependency Walker找出缺少的依赖项。
答案 4 :(得分:1)
或者您可以使用.NET Reflector。
但是,您也可能只想打电话给供应商并向他们寻求帮助。大多数时候,这些人对他们的产品非常自豪,所以他们会花时间通过电子邮件或聊天来解决你的问题。我刚刚遇到了一个与我使用的第三方电子表格组件类似的问题,即使该公司在德国,我也能够通过让他们重新编译组件并在他们发送给我时快速解决问题新的DLL工作正常。
答案 5 :(得分:1)
最有效的方法可能是运行FusLogVW.exe
(.NET Framework SDK的一部分,请参阅 Assembly Binding Log Viewer (Fuslogvw.exe) ),它将记录发生的每个绑定失败。这样,您可以列出应用程序中的失败绑定尝试。
答案 6 :(得分:0)
一个出发点是尝试使用'Clean Solution'选项,然后构建解决方案。