2017-08-29 68 views
0

我一直在观察ReSharper创建的解决方案的体系结构视图,当我注意到一些项目引用没有编译时间用法,这是否意味着我可以更改程序集在运行时?引用没有编译时使用

回答

1

简而言之,编译时使用意味着即使删除引用,代码也会编译。您无法直接从此声明中获取有关运行时的任何信息。如果你只是删除这个引用,它甚至可能是你的应用程序运行得很好。也可能是你的引用有些混乱,编译器不知道它。这可能是因为引用是实现您编译的接口,或者您正在运行时手动查找它(请参阅Florians答案)。如果你真的想,你也可以用反射来隐藏它。但是这也需要在运行时手动加载程序集。

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

虽然你应该非常小心,但你可以在编译和运行之间更改引用的程序集。如果方法签名更改,则编译时引用将中断。

在运行时,引用程序集将在您尝试与它们交互时加载。装配完成后,它不能直接卸载。您只能卸载AppDomains。因此,如果您想在运行时更改程序集,请查看AppDomains。

那么,那些非编译时引用的用意是什么呢? Florian在其他答案中提到了使用这种最常见的体系结构:插件。还有其他依赖关系,您希望通过接口将代码与实际实现分开。然后,您的项目引用无编译时依赖关系,仅用于将实现交付给实际应用程序。否则,您需要将其添加到您的交付和调试过程中,这可能会很痛苦,具体取决于您的项目。

+0

因此,我编译我的解决方案中的项目。他们现在在我的工作目录中。所以在我的解决方案中,我有两个项目没有编译时间的用法,这是否意味着我可以单独编译其中一个项目(而不是整个解决方案),现在我有工作目录(使用旧版本的项目1程序集)并新创建项目1的组装。所以你说我可以用工作目录中的旧工具更改新创建的程序集,通过与AppDomain一起玩,进程仍在运行(也许有些时间停工)? – kuskmen

+0

这样做的关键是尽可能减少停机时间,而无需启动此过程的新实例,因为例如我的解决方案可能需要大量时间来编译/优化等。我不想通过该过程每次我对没有编译时间的项目进行更改时使用 – kuskmen

+0

是的,如果您使用AppDomains,则应该能够设置一些逻辑来实现此目的。看看例如https://www.brad-smith.info/blog/archives/500的一些想法 –