You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#.NET Standard2.0如何限制接口仅允许程序集内部实现

限制接口仅允许程序集内部实现的方案

针对你需要用接口配合泛型复用逻辑、同时要阻止外部程序集实现IPixel避免unsafe类型转换异常的需求,最稳妥的方案是用编译期拦截实现,完全兼容.NET Standard 2.0 + C# 10环境,也不需要把结构体改成引用类型。

实现步骤

  • 给IPixel接口添加一个internal访问级别的占位成员
    接口的实现类型必须实现接口的所有成员,只要你在接口里加一个仅当前程序集可见的成员,外部程序集根本看不到这个成员,自然没法写出合法的接口实现,编译器会直接报错拦截错误用法。
    public interface IPixel
    {
        // 保留你原本定义的所有公共接口成员,比如通道属性、编解码相关方法
        byte R { get; }
        byte G { get; }
        byte B { get; }
    
        // 新增internal占位方法,不需要任何实际逻辑
        internal void CheckInternalAccess();
    }
    
  • 在内部的两个像素结构体中显式实现这个占位成员
    RgbPixel和RgbaPixel和接口在同一程序集,可以访问internal成员,用显式接口实现的方式写空方法即可。显式实现的成员不会出现在结构体的公共API列表里,用户使用你的像素类型时完全感知不到这个成员。
    [StructLayout(LayoutKind.Sequential)]
    public struct RgbPixel : IPixel
    {
        public byte R;
        public byte G;
        public byte B;
    
        void IPixel.CheckInternalAccess()
        {
            // 空实现即可,仅用于占位校验
        }
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct RgbaPixel : IPixel
    {
        public byte R;
        public byte G;
        public byte B;
        public byte A;
    
        void IPixel.CheckInternalAccess()
        {
            // 空实现即可
        }
    }
    

方案优势与注意事项

  • 零运行时开销:整个校验逻辑在编译期完成,不会增加运行时的判断成本,完全不影响你unsafe代码的性能。
  • 兼容性达标:C# 8.0就已经支持接口声明非public成员,C# 10对该特性的支持非常稳定;该特性是编译器层面实现的,不需要依赖高版本运行时的API,编译后的程序可以正常在.NET Standard 2.0环境下运行。
  • 不破坏公共API:占位成员是显式实现的internal成员,不会对外暴露,不会影响库的正常使用。
  • 如果有单元测试项目需要访问内部成员,可以在库项目中添加[assembly: InternalsVisibleTo("你的测试项目程序集名")]特性给测试项目开放权限,不会影响接口对外的限制效果。

该方案无法拦截通过反射、动态IL生成等方式绕过编译器强行构造实现类的场景,但这类操作属于故意破坏封装的非正常使用,本身就不在库的兼容范围内,不需要额外处理。

内容的提问来源于stack exchange,提问作者SAY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:39:27