1

I have a C# Console application which references Sybase.Data.AseClient.

  • dev machine has version 1.15.325 version of dll
  • UAT has version 1.12.XYXZ
  • Prod has version 1.15.115

I get the below exception on a machine similar to prod


ERROR 2010-11-11 18:18:23,562 15546ms FxSpotRateServer Main - Error System.TypeInitializationException: The type initializer for 'Sybase.Data.AseClient.AseConnection' threw an exception. ---> Sybase.Data.AseClient.AseException: Build number Mismatch - sybdrvado115a.dll. Expecting build number greater than or equal to '325'. Loaded build number 152. at Sybase.Data.AseClient.AseConnection.CheckVersion() at Sybase.Data.AseClient.AseConnection..cctor() --- End of inner exception stack trace --- at Sybase.Data.AseClient.AseConnection..ctor(String connectionString) at Applicationname.ClassName.GetAseConnectionString(String connectionString) in -------------------------------------------------------------------------------------------

I am thinking of doing having a runtime binding configured in my app.config and do this redirection on runtime.

Is there some other way/patterns to dynamically plug in these versions?
Is my approach clean and suggested?

4

3 回答 3

1

默认情况下,.NET 绑定到它所构建的程序集的版本,假设它已经使用该版本进行了测试。通过添加运行时绑定配置,您就是在告诉 .NET,您已经验证了一切都适用于备用版本。您基本上已经告诉 .NET,“相信我。我知道我在做什么。” 对于您的情况,这听起来是最合理的方法。(在更复杂的情况下,您可以在代码中动态加载 DLL 而无需考虑程序集版本,但这更适用于插件或其他您不知道程序集的情况。)

于 2010-11-11T18:44:06.087 回答
1

这不是您可以使用 .config 文件解决的问题。它正在寻找实际上完成繁重工作的非托管代码的旧版本。该名称在错误消息 sybdrvado115a.dll 中。我会先查看 c:\windows\system32 。

您将不得不更新该机器上的 Sybase 提供程序以克服此异常。或者在某处找到托管包装器的旧版本。升级并让所有机器保持最新状态,绝对是更好的解决方案。

于 2010-11-11T18:49:05.097 回答
0

我决定让 DEV 机器与 UAT 相同,从而降级我在 DEV 机器上的 Sybase Provider 版本。UAT 和 PROD 是由系统人员制作的。我认为它比运行时程序集加载更好,因为我们将拥有透明的 DEV 环境,人们只会使用他们可以在 UAT 和 PROD 中运行的功能。尽管我没有做任何事情,但使用较低版本的 Sybase 提供程序无法解决问题,但让所有环境保持一致是安全的。

谢谢大家。

于 2010-11-12T15:31:13.177 回答