如何在运行时检测缺少.NET参考?如何在、NET

2023-09-03 07:09:47 作者:盖世小可爱/混世小仙女

我的应用程序包含引用外部库(SQL Server管理对象)。显然,如果该库不运行时系统present,应用程序仍然有效的只要没有方法从这个库被称为是使用类的。

My application contains references to an external library (the SQL Server Management Objects). Apparently, if the library is not present on the run-time system, the application still works as long as no methods are called that use classes from this library.

问题1:这是指定的行为或只是一个(幸运的)侧的方式对CLR的负载库

要检测的基准是否可访问,我目前使用code是这样的:

To detect whether the reference is accessible, I currently use code like this:

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抛出,即使对象实例化的try-catch块内occurrs)。

It works, but it seems to be quite ugly. Note that it only works if TestMethod is a separate method, otherwise the exception will be thrown at the beginning of IsLibraryAvailable (before the try-catch, even if the object instantiation occurrs within the try-catch block).

问题2:有没有更好的选择

在特别的,我怕像内联函数的优化可以从工作阻止我的code。

In particular, I'm afraid that optimizations like function inlining could stop my code from working.

推荐答案

这是意料之中的,因为在JIT是懒惰的每个方法的水平。请注意,内联是不是一个问题在这里,因为这也是一个JIT的关注,不是一个编译器的关注。

That is expected, since the JIT is lazy at the per-method level. Note that inlining isn't an issue here, since that is also a JIT concern, not a compiler concern.

更好的选择:

确保该应用程序与所有安装需要 在使用ilmerge或类似的创建一个单一的组件(如果可能)

就个人而言,我只是使用第一个选项。

Personally, I'd just use the first option.