c# - 引用没有编译时用法

标签 c# .net resharper assemblies

我一直在关注 ReSharper 创建的解决方案的架构 View ,当我注意到一些项目引用没有编译时用法时,这是否意味着我可以在运行时更改程序集?

最佳答案

简单来说,没有编译时使用意味着即使删除引用,您的代码也会编译。您无法从此语句中直接得出有关运行时的任何信息。如果您删除此引用,您的应用程序甚至可能运行得很好。也可能是您的引用有些困惑,编译器不知道。这可能是因为引用正在实现您编译所针对的接口(interface),或者您正在运行时手动查找它(请参阅 Florians 的回答)。如果你真的愿意的话,你也可以通过反射来隐藏它。但这还需要在运行时手动加载程序集。

在编译时,编译器会将新的二进制文件链接到引用的程序集中的相应代码。这将允许在运行时自动加载程序集。它还会将 const 值复制到您的程序集中。

尽管您应该非常小心,但您绝对可以在编译和运行时之间更改引用的程序集。如果方法签名发生更改,编译时引用将会中断。

在运行时,一旦您尝试与引用的程序集交互,就会加载它们。程序集一旦加载,就不能直接卸载。您只能卸载 AppDomain。因此,如果您想在运行时更改程序集,请查看 AppDomains。

那么这些非编译时引用的预期用途是什么? Florian 在另一个答案中提到了使用此功能的最常见架构:插件。还有其他依赖项,您希望通过接口(interface)将代码与实际实现分开。没有编译时依赖项的项目引用仅用于将实现交付给实际应用程序。否则,您需要将其添加到交付和调试过程中,这可能会很痛苦,具体取决于您的项目。

关于c# - 引用没有编译时用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45933212/

相关文章:

c# - 如何检查where的结果长度

c# - Unity3D : Cannot change scripting backend to . 网络

c# - 为什么 resharper 建议左操作数永远不为空

c# - Azure 上的 Rss 聚合器 - 最佳方式

c# - 将锁定防止通过反射完成的更改

c# - Jqgrid中如何显示间接数据

c# - 获取图像的特定部分(图片)

.net - WCF中的后台线程

c# - ReSharper 和对象初始值设定项的间距

javascript - 如何使用 resharper testr jasmin 测试 spa js 模块?