1

我有第三方工作流软件(Captaris Teamplate),它从我的项目中引用一个程序集,它通过GAC从我们的项目解决方案中引用其他程序集。

当我们的应用程序执行时,它会调用 Captaris Teamplate 方法来创建一个工作流过程,该过程又使用 GAC 中的项目程序集将数据存储到数据库中。

问题是当我编译我的项目并从 GAC 中删除程序集并用新版本替换它们时,但是当我运行整个项目时,Captaris Teamplate 会引发错误:

异常类型:System.IO.FileNotFoundException
消息:找不到文件或程序集名称 VBAssembly 或其依赖项之一。
FileName: VBAssembly
FusionLog: === 预绑定状态信息 ===
LOG: DisplayName = VBAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

也就是说,它不会给我程序集 DLL 文件的名称。它试图找到它正在寻找的版本。此类问题的故障排除就像在黑暗中射击,它可以杀死保存在 ASP.NET 临时文件夹、项目文件夹和网站文件夹 (inetpub) 中的旧程序集、重新启动等、测试错误、出现错误,搜索其他一些旧程序集等。

所以我的问题是:

  1. 是否有一种技术可以让我提取有关此异常的更多信息,例如缺少的程序集名称和版本?
  2. 有没有一种简单的方法可以在编译时从系统中清除所有旧的程序集版本?
  3. 在处理这个DLL Hell和/或 Captaris Teamplate 时还有其他建议吗?

我们将 ASP.NET 1.1 版与带有 Captaris Workflow 5.0 的 Visual Studio 2003 一起使用。

4

7 回答 7

1

或者您可以使用.NET Reflector

但是,您也可能只想致电供应商并向他们寻求帮助。大多数时候,这些人对他们的产品感到非常自豪,所以他们会花时间通过电子邮件或聊天来引导您解决问题。我刚刚在使用的第三方电子表格组件中遇到了类似的问题,即使该公司在德国,我也能够通过让他们重新编译组件并在他们发送给我时快速解决问题新的 DLL 它工作得很好。

于 2008-11-26T16:36:55.047 回答
1

如果可能,请避开 GAC。它适用于 DLL Hell。VBAssembly 实际上可能是非托管的,并且可能已从WINDOWS/system32目录中删除。

于 2008-11-26T15:57:06.813 回答
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 可以引用。

于 2008-11-26T16:03:35.257 回答
1

也许您可以创建一个绑定策略,将您从 XXX 删除到 GAC 的程序集的任何请求重定向到新位置。请参阅绑定策略

于 2008-11-26T16:09:39.267 回答
1

可能最有效的方法是运行FusLogVW.exe(.NET Framework SDK 的一部分,请参阅Assembly Binding Log Viewer (Fuslogvw.exe)),它将记录发生的每个绑定失败。这样,您可以列出应用程序中失败的绑定尝试。

于 2008-12-09T12:55:36.877 回答
1

使用Dependency Walker找出缺少的依赖项。

于 2008-11-26T16:26:37.517 回答
0

一个起点是尝试使用“清洁解决方案”选项,然后构建解决方案。

于 2008-11-26T13:46:02.913 回答