如何创建和使用.NET元数据“参考组件”?从3.0版开始,.NET在C:\ProgramFilesReferenceAssemblies\Microsoft....下安装了许多不同的“参考程序集”,以支持不同的配置文件(如.NET3.5客户端配置文件、Silverlight配置文件)。其中每一个都是仅包含元数据(无IL代码)的适当.NET程序集,并且每个程序集都标有ReferenceAssemblyAttribute。元数据仅限于适用配置文件下可用的那些类型和成员——这就是智能感知显示一组受限类型和成员的方式。在运行时不使用引用程序集。我从这篇博文中学到了一些东西。我想为我的库创建和使用这样的引用程序集。如何创建仅包含元数据的程序集-是否有一些编译器标志或ildasm后处理器?是否有一个属性可以控制将哪些类型导出到不同的“配置文件”?引用程序集如何在运行时解析-如果我的应用程序目录中有一个引用程序集而不是“真实”程序集,而不是GAC中的引用程序集,则探测继续并且我的AssemblyResolve事件触发,以便我可以实际程序集在运行时提供?任何关于我在哪里可以学到更多的想法或指示将不胜感激。更新:环顾四周,我看到.NET3.0“参考程序集”似乎确实有一些代码,并且参考程序集属性仅在.NET4.0中添加。因此,新运行时的行为可能会改变。为什么?对于我的Excel-DNA(http://exceldna.codeplex.com)加载项库,我通过将引用的程序集作为资源打包到.xll文件中来创建单文件.xll加载项。打包的程序集包括用户的加载项代码,以及Excel-DNA托管库(可能由用户的程序集引用)。这听起来相当复杂,但在大多数情况下工作得很好——加载项是一个小文件,因此不存在安装分发问题。由于版本不同,我遇到了(并非意外)问题-如果旧版本的Excel-DNA托管库作为文件出现,运行时将加载而不是打包的运行时(我永远没有机会干涉与加载)。我希望为我的Excel-DNA托管部分做一个参考编译,用户在编译他们的加载项时可以指向该部分。但是如果他们在运行时错误地拥有这个程序集的一个版本,那么运行时应该无法加载它并让我有机会从资源中加载真正的程序集。要创建引用程序集,您可以将此行添加到您的AssemblyInfo.cs文件:[assembly:ReferenceAssembly]要加载其他程序集,您可以像往常一样从VisualStudio项目引用中引用它们,或者在运行时动态地使用:Assembly.ReflectionOnlyLoad()或Assembly.ReflectionOnlyLoadFrom()如果您使用VisualStudio添加了对元数据/引用程序集的引用,则Intellisense和构建项目将正常工作,但如果您尝试针对其中之一执行应用程序,则会发生错误:System.BadImageFormatException:The无法为执行加载引用的程序集。因此,期望在运行时,您将用相同的元数据签名替换实际程序集。如果一个程序集是使用Assembly.ReflectionOnlyLoad()动态加载的,那么您只能对其执行所有反射操作(读取类型、方法、属性、特性等,但不能动态调用它们中的任何一个)。我很好奇您创建仅元数据程序集的用例是什么。我以前从未这样做过,并且很想知道您是否找到了一些有趣的用途...如果您仍然对这种可能性感兴趣,我已经创建了一个基于Mono的il-repack项目的分支。Cecil,它接受一个“/meta”命令行参数来为公共和受保护类型生成仅元数据的程序集。https://github.com/KarimLUCCIN/il-repack/tree/xna(我在完整的XNA框架上试过了,它成功了……)是的,这是.NET4.0中的新功能。我很确定这是为了避免.NET2.0服务包中令人讨厌的版本控制问题。最好的示例是在SP2中添加和记录的WaitHandle.WaitOne(int)重载。一种流行的重载,因为它避免在WaitOne(int,bool)重载中猜测*exitContext的正确值。问题是程序在SP2之前的2.0版本上运行时会崩溃。对诊断也不是很满意。隔离引用的组件可确保不再发生这种情况。我认为这些参考程序集是通过从已编译程序集的副本开始创建的(就像在以前的版本中所做的那样)并通过从程序集中剥离IL的工具运行它们。但是,我们不能使用该工具,bin/netfx4.0工具Windows7.1SDK子目录中没有任何东西可以执行此操作。不完全是一个经常使用的工具,所以它可能不是生产质量:)你可能对Cecil库(来自Mono)感到满意;我认为实现允许ILMerge功能,它也可以只写元数据组件。我扫描了代码库(文档稀疏),但没有发现任何明显的线索...YYMV以上是C#学习教程:如何创建和使用.NET仅元数据“参考组件”?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
