-refonly选项表示应输出参考程序集,而不是作为主要输出的实现程序集。由于参考程序集无法执行,因此 -refonly 参数会静默禁止输出 PDB。
-refonly
仅包含元数据的程序集将其方法体替换为单个`throw null`body,但包括除匿名类型之外的所有成员。使用`throw null`body(而不是 no body)的原因是为了让PEVerify能够运行并通过(从而验证元数据的完整性)。
引用程序集包括一个程序集级别的`ReferenceAssembly`属性。此属性可以在源中指定(那么编译器就不需要合成它)。由于这个属性,运行时将拒绝加载引用程序集以进行执行(但仍可以以仅反射模式加载)。对程序集进行反射的工具需要确保它们将引用程序集作为仅反射加载,否则将从运行时接收到类型加载错误。
引用程序集会进一步移除只包含元数据的程序集中的元数据(私有成员):
•引用程序集只对其在 API 表面所需的内容进行引用。真实程序集可能有与特定实现相关的其他引用。
•如果删除私有函数成员(方法、属性和事件)不会对编译产生明显影响,则会将其删除。如果没有 InternalsVisibleTo 属性,则对内部函数成员采取同样的做法。
•但所有类型(包括私有或嵌套类型)都保留在引用程序集中。所有属性都会被保留(即使是内部属性)。
•保留所有虚方法。保留接口的明确实现。明确实现的属性和事件会被保留,因为它们的访问器是虚拟的(因此会被保留)。
•保留结构体的所有字段(这是 C#-7.1 后改进的候选字段)
-refonly 和 -refout 选项是互斥的。