我一直在关注ReSharper创建的解决方案的架构视图,当我发现一些项目引用没有编译时用法时,这是否意味着我可以更改程序集在运行时?
答案 0 :(得分:2)
简单来说,编译时使用意味着即使删除引用,代码也会编译。您无法从此语句直接派生有关运行时的任何内容。如果您删除此引用,甚至可能是您的应用程序运行完全正常。也可能是您的引用有些混淆,编译器也不知道它。这可能是因为引用正在实现您编译的接口,或者您正在运行时手动查找它(请参阅Florians的答案)。如果你真的想,你也可以用反射隐藏它。但是这也需要在运行时手动加载程序集。
在编译时,编译器会将新二进制文件链接到引用程序集中的相应代码。这将允许在运行时自动加载程序集。它还会将const值复制到程序集中。
你绝对可以在编译和运行时之间更改引用的程序集,尽管你应该非常小心。如果方法签名发生了变化,编译时引用就会中断。
在运行时,一旦尝试与它们交互,就会加载引用的程序集。加载程序集后,无法直接卸载。您只能卸载AppDomains。因此,如果您想在运行时更改程序集,请查看AppDomains。
那么那些非编译时引用的预期用途是什么? Florian在另一个答案中提到了使用它的最常见架构:插件。您还希望通过接口将代码与实际实现分开的其他依赖项。然后,没有编译时依赖性的项目引用仅用于将实现交付给实际应用程序。否则,您需要将其添加到交付和调试过程中,这可能会很麻烦,具体取决于您的项目。