從 .NET 10 開始, System.Reflection API InvokeMember、 FindMembers和 DeclaredMembers 會使用更受限制的註解,而不是 DynamicallyAccessedMemberTypes.All。
此變更會影響開發人員實作 IReflect 介面或衍生自 TypeInfo的案例。 先前的使用 DynamicallyAccessedMemberTypes.All 過於寬鬆,可能會導致意外行為,例如捕獲類別實現的介面方法或由於不安全的反射呼叫而產生警告。
推出的版本
.NET 10
先前的行為
先前,受影響的 API 使用 DynamicallyAccessedMemberTypes.All 註釋,其限制過於寬鬆。 這可能會導致擷取其他成員,例如類別所實作的介面方法,並可能導致執行階段警告或不安全的反映呼叫。
新行為
受影響的 API 現在使用更受限制的註釋,這可以更好地控制反射期間捕獲的成員。
破壞性變更的類型
變更的原因
引入此更改是為了提高 API 中 System.Reflection 註釋的準確性並解決因過度寬鬆 DynamicallyAccessedMemberTypes.All 註釋而引起的問題。 這確保了與修剪及反射情境的更好相容性,減少執行時警告,並防止不安全的反射呼叫。
建議的動作
如果您實作 IReflect 或衍生自 TypeInfo,請檢閱程式碼並更新註解以符合新行為。 具體而言:
請將 DynamicallyAccessedMemberTypes.All 註解替換為限制更多的註解,例如 DynamicallyAccessedMemberTypes.PublicMethods、DynamicallyAccessedMemberTypes.NonPublicMethods或其他適當類型。
下列程式碼片段顯示範例。
class MyType : IReflect { [DynamicallyAccessedMembers( DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties | DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public object InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters) { } }測試反射情境,確保更新後的註解能捕捉預期成員,且不會在執行時出現錯誤或警告。
如需 DynamicallyAccessedMembers 註解及其使用方式的詳細資訊,請參閱 準備 .NET 程式庫以進行修剪。