2

我最近发现需要在编译时检查是否:a)某个程序集引用存在并且可以成功解析,或者 b)某个类(其完全限定名称已知)已定义。这两种情况对我来说是等价的,所以能够检查其中一种就足够了。有没有办法在.NET/C# 中做到这一点?预处理器指令最初让我觉得可能会有所帮助,但它似乎没有必要的功能。

当然,在运行时检查类型是否存在可以很容易地完成,但不幸的是,在这种情况下这并不能解决我的特定问题。(我需要能够忽略缺少某个引用的事实,从而回退到代码中的另一种方法。)

4

3 回答 3

1

您是否有理由不能添加引用,然后在程序集中的类型上使用 typeof 表达式来验证它是否可用?

var x = typeof(SomeTypeInSomeAssembly);

如果包含 SomeTypeInSomeAssembly 的程序集未被引用且可用,则不会编译。

于 2009-06-04T22:52:28.500 回答
1

听起来您希望编译器忽略一个代码分支,这实际上只能通过将其隐藏在 #if 块后面来实现。定义编译器常量并使用#if 是否适合您的目的?

#if MyConstant
.... code here that uses the type ....
#else
.... workaround code ....
#endif

另一种选择是在编译时完全不依赖其他类,并使用反射或 .NET 4.0 动态关键字来使用它。如果在 .NET 3.5 或更早版本的性能关键场景中重复调用它,您可以使用 DynamicMethod 在首次使用时构建代码,而不是每次都使用反射。

于 2009-06-04T23:02:02.270 回答
1

我似乎在这里找到了解决方案,尽管并不完全符合我最初的希望。

我的解决方案:

我最终做的是创建一个新的构建配置,然后定义一个预编译器常量,我在代码中使用它来确定是使用引用还是回退到替代(保证工作)方法。它不是全自动的,但它相对简单并且看起来很优雅——对我的目的来说已经足够了。

选择:

If you wanted to fully automate this, it could be done using a pre-build command that runs a Batch script/small program to check the availabilty of a given reference on the machine and then updates a file containing precompiler constants. This however I considered more effort than it was worth, though it may have been more useful if I had multiple independent references that I need to resolve (check availability).

于 2009-06-05T21:59:54.287 回答