如何在运行时检测缺失的.NET引用?

6

我的应用程序包含对外部库(SQL Server管理对象)的引用。显然,如果在运行时系统上不存在该库,则只要不调用使用此库的类的方法,应用程序仍然可以正常工作。

问题1:这是指定的行为还是CLR加载库的(幸运的)副作用?

要检测引用是否可访问,我目前使用以下代码:

Function IsLibraryAvailable() As Boolean
    Try
        TestMethod()
    Catch ex As FileNotFoundException
        Return False
    End Try
    Return True
End Function

Sub TestMethod()
    Dim srv As New Smo.Server()  ' Try to create an object in the library
End Sub

它能工作,但看起来相当丑陋。请注意,只有在TestMethod是一个单独的方法时才能正常工作,否则异常将在IsLibraryAvailable开始处抛出(即使对象实例化发生在try-catch块内)。

问题2:有更好的替代方案吗?

特别是我担心像函数内联这样的优化会使我的代码停止工作。


1
触发动态编译(以及类似的事情)的东西可能会导致看似无关的代码在库不可用时失败。例如,序列化/反序列化、ASP.NET配置文件功能在一个看似无关的引用程序集丢失时对我而言也失败了。这会导致非常难以调试的问题。 - MatthewMartin
1个回答

4

这是预料中的,因为JIT在每个方法级别上都是懒惰的。请注意,内联在这里不是问题,因为这也是JIT关注的而不是编译器的关注点。

更好的选择:

  • 确保应用程序安装了所需的一切
  • 使用ilmerge或类似工具创建单个程序集(如果可能)

个人而言,我会选择第一种选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接