【发布时间】:2011-09-26 12:22:19
【问题描述】:
从 3.0 版开始,.NET 在 C:\Program Files\Reference Assemblies\Microsoft.... 下安装了一堆不同的“参考程序集”,以支持不同的配置文件(例如 .NET 3.5 客户端配置文件、Silverlight 配置文件)。其中每一个都是正确的 .NET 程序集,仅包含元数据 - 没有 IL 代码 - 每个程序集都标有 ReferenceAssemblyAttribute。元数据仅限于适用配置文件下可用的那些类型和成员 - 这就是智能感知显示一组受限类型和成员的方式。运行时不使用引用程序集。
我从this blog post那里学到了一点。
我想为我的库创建和使用这样的参考程序集。
- 如何创建仅元数据程序集 - 是否有一些编译器标志或 ildasm 后处理器?
- 是否有属性可以控制将哪些类型导出到不同的“配置文件”?
- 如何在运行时解析参考程序集 - 如果我的应用程序目录中存在参考程序集而不是“真实”程序集,而不是 GAC 中,那么探测将继续并且我的 AssemblyResolve 事件触发,以便我可以在运行时提供实际的程序集吗?
任何想法或指示我可以在哪里了解更多关于这方面的信息将不胜感激。
更新: 环顾四周,我发现 .NET 3.0 的“参考程序集”似乎确实有一些代码,而 Reference Assembly attribute 仅在 .NET 4.0 中添加。因此,新运行时的行为可能会有所改变。
为什么? 对于我的 Excel-DNA (http://exceldna.codeplex.com) 插件库,我通过将引用的程序集作为资源打包到 .xll 文件中来创建单文件 .xll 插件。打包的程序集包括用户的加载项代码,以及 Excel-DNA 托管库(可能被用户程序集引用)。
这听起来相当复杂,但在大多数情况下运行得非常好 - 加载项是一个小文件,因此没有安装分发问题。由于版本不同,我遇到了(并非意外)问题 - 如果有旧版本的 Excel-DNA 托管库作为文件,运行时将加载它而不是打包的(我从来没有机会干扰加载中)。
我希望为我的 Excel-DNA 托管部件制作一个参考程序集,用户可以在编译他们的加载项时指向它。但是如果他们在运行时错误地拥有了这个程序集的版本,那么运行时应该无法加载它,并让我有机会从资源中加载真正的程序集。
【问题讨论】:
标签: c# .net assemblies