我一直在观察ReSharper创建的解决方案的体系结构视图,当我注意到一些项目引用没有编译时间用法,这是否意味着我可以更改程序集在运行时?引用没有编译时使用
0
A
回答
1
简而言之,编译时使用意味着即使删除引用,代码也会编译。您无法直接从此声明中获取有关运行时的任何信息。如果你只是删除这个引用,它甚至可能是你的应用程序运行得很好。也可能是你的引用有些混乱,编译器不知道它。这可能是因为引用是实现您编译的接口,或者您正在运行时手动查找它(请参阅Florians答案)。如果你真的想,你也可以用反射来隐藏它。但是这也需要在运行时手动加载程序集。
在编译时,编译器会将新的二进制文件链接到引用程序集中的相应代码。这将允许在运行时自动加载程序集。它也会将常量值复制到你的程序集中。
虽然你应该非常小心,但你可以在编译和运行之间更改引用的程序集。如果方法签名更改,则编译时引用将中断。
在运行时,引用程序集将在您尝试与它们交互时加载。装配完成后,它不能直接卸载。您只能卸载AppDomains。因此,如果您想在运行时更改程序集,请查看AppDomains。
那么,那些非编译时引用的用意是什么呢? Florian在其他答案中提到了使用这种最常见的体系结构:插件。还有其他依赖关系,您希望通过接口将代码与实际实现分开。然后,您的项目引用无编译时依赖关系,仅用于将实现交付给实际应用程序。否则,您需要将其添加到您的交付和调试过程中,这可能会很痛苦,具体取决于您的项目。
相关问题
- 1. 没有引用pthread_mutex_lock与-lpthread编译
- 2. 添加引用时没有编译错误,但在编译时发现错误
- 3. Postgres在索引编译期间没有使用足够的CPU!
- 4. 编译没有ros的roscpp(使用g ++)
- 5. 编译时没有库[LWJGL]
- 6. 编译没有Silverlight项目引用的Web应用程序
- 7. 什么时候StringBuffer/StringBuilder没有被编译器隐式使用?
- 8. 使用GCC编译时间typeid而没有RTTI
- 9. 未定义的引用“_asan_init_v4”编译时
- 10. 在android编译proguard时引用错误?
- 11. 没有引用的类是否被编译?
- 12. 使用libvpx编译项目时未定义的引用
- 13. 当使用maven引用一个库时编译错误
- 14. 尝试使用cmake编译代码时未定义的引用
- 15. 没有使用gettext翻译
- 16. 当库没有注册时,无法使用引用的TLB编译.NET应用程序
- 17. R.string没有编译
- 18. SFINAE没有编译
- 19. 没有libc编译
- 20. 编译没有Crashlytics Mac应用程序?
- 21. xamarin应用程序并没有编译
- 22. 编译OpenCV没有sse用于ROS
- 23. 编译引用的dll
- 24. g ++:编译时没有-l标志
- 25. PCRE编译时没有UTF支持
- 26. C++ Builder(XE7)编译时没有链接?
- 27. Collections.sort没有编译时间错误
- 28. SQLiteException:没有这样的列:,编译时
- 29. 有没有办法找出在Linux上编译.so库时使用的编译器选项?
- 30. “没有匹配的函数调用'绑定'”当使用Android NDK编译时
因此,我编译我的解决方案中的项目。他们现在在我的工作目录中。所以在我的解决方案中,我有两个项目没有编译时间的用法,这是否意味着我可以单独编译其中一个项目(而不是整个解决方案),现在我有工作目录(使用旧版本的项目1程序集)并新创建项目1的组装。所以你说我可以用工作目录中的旧工具更改新创建的程序集,通过与AppDomain一起玩,进程仍在运行(也许有些时间停工)? – kuskmen
这样做的关键是尽可能减少停机时间,而无需启动此过程的新实例,因为例如我的解决方案可能需要大量时间来编译/优化等。我不想通过该过程每次我对没有编译时间的项目进行更改时使用 – kuskmen
是的,如果您使用AppDomains,则应该能够设置一些逻辑来实现此目的。看看例如https://www.brad-smith.info/blog/archives/500的一些想法 –