在 C# 中获取整个程序集

本文关键字:程序集 获取 | 更新日期: 2023-09-27 18:35:27

我正在尝试消除来自我的 API 的调用,最终用户必须在他们的代码中传递Assembly.GetExecutingAssembly(),目前我的代码看起来如下。

public static Dictionary<int, Packet> Packets { get; private set; }
public static void Init()
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    foreach (Type type in assembly.GetTypes())
    {
        if (type.BaseType == typeof(Packet))
        {
             ...
        }
    }
}

但是,这仅获取 API.dll 中可用的所有类,并且不包含使用该.dll的项目中的任何类,

但是,如果我将其作为参数传递,如下所示:

 public static void Init(Assembly assembly) {}

它加载一切就可以了,这是预期的行为,有没有办法在后台完成这一切,而最终用户不必担心 Assmebly 调用?

简而言之 - 我有一个人们将在他们的项目中使用的.dll文件,我想从使用该.dll的项目中获取所有类,而不是.dll中的所有类

在 C# 中获取整个程序集

它像Assembly.GetCallingAssembly一样简单吗?

为什么要限制客户端必须在单个程序集中定义其Packet类? 如果客户端想要在不同的程序集中实现不同类型的Packet类,该怎么办? 如果有人想在运行时生成运行时代码并在运行时创建Packet类怎么办?

您的 API 不应关心数据包类的定义位置或方式。 它应该只公开一个接口,该接口将允许客户端直接注册新的Packet类型。 这将为客户提供最大的灵活性。

现在,提供帮助程序方法,以便客户端可以从程序集或调用程序集注册类型。

像这样:

class PacketRegistration {
    public void RegisterPacketType(Type packetType) {...}
    public void RegisterPacketType<TPacket>() where TPacket:Packet { 
         RegisterPacket(typeof(TPacket)); 
    }
    public void RegisterPacketTypesFromAssembly(Assembly assembly) {...}
    public void RegisterPacketTypesFromCurrentAssembly() {
        RegisterPacketTypesFromAssembly(Assembly.GetCallingAssembly());
    }